2013-05-08 38 views
0

xml来自一个url,我需要的是从中拉出字符串“N0014E1”。我不确定为什么这个代码不工作。我把一个try块绕过它,我得到一个 “数据根级别无效”从xml中拉字符串

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(); 
    } 
+1

看起来像'obj'和'is'之间应该有一个空格吗? – zimdanen 2013-05-08 15:56:39

+1

这是XML的全部?如果是这样,它是无效的XML,这就是为什么你会收到错误。开始标记是objis,结束标记是obj - 开始标记和结束标记必须匹配。 – Tim 2013-05-08 15:56:46

+0

obj和之间有一个空格,它只是没有复制,对此抱歉。是的,这是整个XML页面。 – kevintdiy 2013-05-08 16:01:32

回答

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的引用。

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

+0

尽管其无效的XML? – kevintdiy 2013-05-08 16:32:23

+0

@kevintdiy你确实是正确的,它缺少'xsi'的定义。更新了我的回复。 – Kami 2013-05-08 16:45:30

+0

好吧,我没有权限更改无效的XML。你会建议我通过通配符搜索字符串吗? – kevintdiy 2013-05-08 17:23:51