0

xml 来自一个 url,我需要的只是从中拉出字符串“N0014E1”。我不确定为什么这段代码不起作用。我在它周围放了一个 try 块,我得到“数据根级别无效”

xml:

<obj is="c2g:Network " xsi:schemaLocation="http://obix.org/ns/schema/1.0/obi/xsd" href="http://192.168.2.230/obix/config/">
  <ref name="N0014E1" is="c2g:LOCAL c2g:Node"xsi:schemaLocation="http://obix.org/ns/sc/1.0/obix/xsd" href="N0014E1/"></ref>
</obj>

C#代码:

    public static string NodePath = "http://" + MainClass.IpAddress + ObixPath;


    public static void XMLData()
    {
        XmlDocument NodeValue = new XmlDocument();
        NodeValue.LoadXml(NodePath);


        var nodes = NodeValue.SelectNodes(NodePath);

        foreach (XmlNode Node in nodes)
        {
            HttpContext.Current.Response.Write(Node.SelectSingleNode("//ref name").Value);
            Console.WriteLine(Node.Value);
        }

        //Console.WriteLine(Node);
        Console.ReadLine();
    }
4

1 回答 1

0

您的SelectNodesSelectSingleNode命令不正确。两者都期望一个 xpath 字符串来标识节点。

尝试以下

string xml = @"<obj is=""c2g:Network "" href=""http://192.168.2.230/obix/config/""><ref name=""N0014E1"" is=""c2g:LOCAL c2g:Node"" href=""N0014E1/""></ref></obj>";

XmlDocument NodeValue = new XmlDocument();
NodeValue.LoadXml(xml);
XmlNode r = NodeValue.SelectSingleNode("//ref[@name]");
if (r != null)
{
    System.Diagnostics.Debug.WriteLine(r.Attributes["name"].Value);
}

另外,请注意,该LoadXml方法只是加载一个 xml 字符串;它不会从远程 url 加载。

正如@kevintdiy 指出的那样,您的 xml 并不完全正确。在上面的示例中,我删除了xsi参考,因为您缺少它的定义。

如果您有权访问源 xml,则删除对的引用(xsi如果不需要)或将其定义添加到根节点。

如果这是不可能的,那么您可能需要考虑使用正则表达式或其他基于字符串的方法来获取值。

于 2013-05-08T16:22:31.963 回答