假如test.xml如下:
<root xmlns="http://www.xyz.zyx.com">
    <description>something here</description>
    <name>oneBody</name>
</root>
为什么我用:
 XmlDocument doc = new XmlDocument();
doc.Load("test.xml");
XmlNode node=doc.SelectSingleNode(@"/root/name"); //根本取不到值,为Null
但是用:XmlNode node=doc.SelectSingleNode(@"/*[local-name()='root']/*[local-name()='name'");却反尔取得到值??
我试了加XmlNamespaceManger还是不行,请达人指教。

解决方案 »

  1.   

    纠正:
    但是用:XmlNode node=doc.SelectSingleNode(@"/*[local-name()='root']/*[local-name()='name']");却反尔取得到值??
    少了一个“]”括号。
      

  2.   

    LocalName的意思就是不包含namespace前缀的,所以你能够正确匹配值!我们知道任何变量都有需要唯一标示,也就是用namespace+localname,我们得到这个变量的时侯也应该用这样的qualtifiedName来得到他
    所以你这个问题就很好解决了如果你用默认namespace在前面也是能够匹配的
      

  3.   

    try:XmlDocument xmldoc = new XmlDocument();
    xmldoc.Load("test.xml");
    XmlNamespaceManager nm = new XmlNamespaceManager(xmldoc.NameTable);
    nm.AddNamespace("NM", "http://www.xyz.zyx.com");
    XmlNode node = xmldoc.SelectSingleNode("/NM:root/NM:name", nm);
    Console.WriteLine(node.InnerXml);
      

  4.   

    谢谢了!!现在了解了,测试通过了。
    但是还有一个疑问:在有默认命名空间的情况下也不可以吗??非要NM:XXX这样有前缀才行?
    我只有一个默认命名空间,为什么还一定要加前缀,有没有方法不用加?
      

  5.   

    因为还有一种情况是没有命名空间啊。
    如果说默认命名空间可以省略,那么没有命名空间的情况就和她是一样的了。
    你可以测试一下,把那个xmlns="..."去掉,你原来的代码就可以了。