【问题标题】:XmlNode.SelectNodes Returns 0 NodesXmlNode.SelectNodes 返回 0 个节点
【发布时间】:2012-07-26 06:02:16
【问题描述】:

我有一个这样的 xml:

 <?xml version="1.0" encoding="utf-8" ?>
 <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <reflection-optimizer use="false"/>
    <session-factory>
           <property name="XX">XX</property>
           <property name="XX">XX</property>
    </session-factory>  
  </hibernate-configuration>

我正在尝试使用 SelectNodes 选择属性节点,我尝试了以下方法:

root.SelectNodes("property");
root.SelectNodes("//property");
root.SelectNodes("/session-factory/property");
root.SelectNodes("descendant::property");
root.LastChild.SelectNodes("child::property");

但它们都返回 0 个节点。谁能帮我?谢谢。

【问题讨论】:

  • 跟根节点上的命名空间有关。

标签: c# xml xpath


【解决方案1】:

看看这个长答案:

Why is XmlNamespaceManager necessary?

它与根节点上的命名空间有关。

【讨论】:

    【解决方案2】:

    我建议你使用 LINQ to XML

        var xml = XDocument.Parse(
        @"<?xml version=""1.0"" encoding=""utf-8"" ?>
        <hibernate-configuration xmlns=""urn:nhibernate-configuration-2.2"">
        <reflection-optimizer use=""false""/>
        <session-factory>
        <property name=""XX"">XX</property>
        <property name=""XX"">XX</property>
        </session-factory>  
        </hibernate-configuration>");
        var properties = xml.Descendants().Where(p=>p.Name.LocalName.Equals("property")).ToList();
    

    在此处查看 msdn 以获取更多信息:http://msdn.microsoft.com/en-us/library/bb943906.aspx

    【讨论】:

    • 感谢您的回复。我让它使用 LINQ to XML 工作,但我仍然想弄清楚我在使用 SelectNodes 时做错了什么。
    【解决方案3】:
    var nsmgr = new XmlNamespaceManager(root.NameTable);
    nsmgr.AddNamespace("x", "urn:nhibernate-configuration-2.2");
    
    var nodes1 = root.SelectNodes("x:property", nsmgr);
    var nodes2 = root.SelectNodes("/x:session-factory/x:property", nsmgr);
    
    

    【讨论】:

      猜你喜欢
      • 2012-04-15
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 2012-03-18
      • 2017-05-30
      • 1970-01-01
      相关资源
      最近更新 更多