从文档中选择单个XML节点

问题描述 投票:1回答:1

我正在尝试从Philips Hue Bridge返回的XML文档中加载一些值。这是我要解析的XML的示例(示例取自Philips网站):

<root xmlns="urn:schemas-upnp-org:device-1-0">
    <specVersion>
        <major>1</major>
        <minor>0</minor>
    </specVersion>
    <URLBase>https://192.168.1.130:80/</URLBase>
    <device>
        <deviceType>urn:schemas-upnp-org:device:Basic:1</deviceType>
        <friendlyName>Philips hue (192.168.1.130)</friendlyName>
        <manufacturer>Royal Philips Electronics</manufacturer><manufacturerURL>https://www.philips.com</manufacturerURL>
        <modelDescription>Philips hue Personal Wireless Lighting</modelDescription>
        <modelName>Philips hue bridge 2012</modelName>
        <modelNumber>929000226503</modelNumber>
        <modelURL>https://www.meethue.com</modelURL>
        <serialNumber>001788102201</serialNumber>
        <UDN>uuid:2f402f80-da50-11e1-9b23-001788102201</UDN>
        <presentationURL>index.html</presentationURL>
        <iconList>
            <icon>
                <mimetype>image/png</mimetype>
                <height>48</height>
                <width>48</width>
                <depth>24</depth>
                <url>hue_logo_0.png</url>
            </icon>
            <icon>
                <mimetype>image/png</mimetype>
                <height>120</height>
                <width>120</width>
                <depth>24</depth>
                <url>hue_logo_3.png</url>
            </icon>
        </iconList>
    </device>
</root>

我在线查看了几个示例,并尝试了各种路径,但是结果始终为null。我在注释中添加了多个示例,向您展示了我尝试过的一些内容。

var xml = webClient.DownloadString($"http://{bridge.internalipaddress.ToString()}/description.xml");
XmlDocument bridgeDetails = new XmlDocument();
bridgeDetails.LoadXml(xml);
XmlNode root = bridgeDetails.DocumentElement;
var friendlyName = bridgeDetails.SelectSingleNode("//device/friendlyName");
//var friendlyName = bridgeDetails.SelectSingleNode("/device/friendlyName");
//var friendlyName = bridgeDetails.SelectSingleNode("device/friendlyName");
//var friendlyName = bridgeDetails.SelectSingleNode("descendant::device/friendlyName");
//var friendlyName = root.SelectSingleNode("//device/friendlyName");
//var friendlyName = root.SelectSingleNode("/device/friendlyName");
//var friendlyName = root.SelectSingleNode("device/friendlyName");
//var friendlyName = root.SelectSingleNode("descendant::device/friendlyName");
//I've also tried adding .Value.ToString() at the end of some of these, but that just caused a null reference exception

编辑:

我已经计算出缺少名称空间。但是我不确定如何没有名称空间的URL。例如:

var nsmgr = new XmlNamespaceManager(bridgeDetails.NameTable);
nsmgr.AddNamespace("upnp", "urn:schemas-upnp-org:device-1-0");

XmlNode root = bridgeDetails.DocumentElement;
var friendlyName = bridgeDetails.SelectSingleNode("//upnp:device/friendlyName");

任何帮助将不胜感激。

c# xpath xml-parsing
1个回答
1
投票

添加名称空间后您的解决方案已关闭。现在使用以下XPath-1.0表达式,因为all子级或<root>在此命名空间中:

//upnp:device/upnp:friendlyName

完整,看起来应该像

var friendlyName = bridgeDetails.SelectSingleNode("//upnp:device/upnp:friendlyName", nsmgr);

并返回您的值

Philips色相(192.168.1.130)


与您的陈述有关

但是我不确定如何命名空间没有URL。

名称空间URI不必是有效的URL。它只必须是一个唯一的字符串(在您的“ name” -space中),而不必指向可检索的文件。没必要。

© www.soinside.com 2019 - 2024. All rights reserved.