XPATH 帮助:使用 XPathNodeIterator 在命名空间中查找 XML 节点

Posted

技术标签:

【中文标题】XPATH 帮助:使用 XPathNodeIterator 在命名空间中查找 XML 节点【英文标题】:XPATH Help: Finding XML Nodes in a Namespace with XPathNodeIterator 【发布时间】:2011-03-23 19:15:51 【问题描述】:

我无法找到正确的 XPATH 语法来使用此 XML 文件获取我想要的节点。一方面,XML 中没有 NameSPace,所以我必须在代码中添加一个。我认为这会影响我的 XPATH。

我有一个如下所示的 XML 文件:

<configuration xmlns="http://schemas.microsoft.com/support/2003/02/config">
  <name>Content</name>
  <description>Desc</description>
  <lastModifiedBy>Me</lastModifiedBy>
  <lastModifiedDate>2011-04-18T14:05:00</lastModifiedDate>
  <section name="MaintenanceNotices">
    <key name="MaintenanceNote1" value="The Title Value" />
    <link id="1234" type="5" href="" target="_self" name="MaintenanceNote1a">
      <description>Description</description>
    </link>
  </section>
</configuration>

所以,对于 XPATH,如果我想在“CONFIGURATION”元素中获取“NAme”节点值,我假设我会使用这个 XPATH:

/configuration/name

但有时我需要将 ns: 添加到它:

/ns:configuration/ns:name

然后我可以像这样找到元素值:

while (xmlNodeIterator.MoveNext()) 
    result += xmlNodeIterator.Current.SelectSingleNode("name", nsmgr).ToString();

但这根本不适合我。无论我尝试什么 xpath,它都不会在 XML 中找到任何值。这是我的代码:

    private string GetXML()
    
        string result = string.Empty;
        string fileName = "Content.xml";
        string filePath = "C:\\Content\\0";

        XPathDocument xdoc = new XPathDocument(string.Format(filePath, fileName));

        var nav = xdoc.CreateNavigator();

        XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable());
        nsmgr.AddNamespace("ns", "http://schemas.microsoft.com/taxonomy/2003/1");
        nsmgr.AddNamespace("gds", "http://support.microsoft.com/common/schemas/gdsPage/1/");

        string sectionName = "MaintenanceNotices";
        string xpath = "/configuration"; 

        //  section[name=0]"; ///key[name=MaintenanceNote1]/";

        XPathNodeIterator xmlNodeIterator = nav.Select(string.Format(xpath, sectionName), nsmgr);

        while (xmlNodeIterator.MoveNext())
        
            result += xmlNodeIterator.Current.SelectSingleNode("name", nsmgr).ToString();
        

        return result;
    

您能看到任何问题,或者对我的 Xpath 语法提出建议吗?

谢谢。

【问题讨论】:

XPath doesn't work as desired in C#的可能重复 【参考方案1】:

我认为您的 XPath 没有任何问题,只是您从未注册文档节点所在的命名空间:

"http://schemas.microsoft.com/support/2003/02/config"

看起来你已经知道如何用你的语言做到这一点(使用AddNamespace),所以这可能只是一个疏忽。如果您需要更多信息,这应该会有所帮助:

XPath doesn't work as desired in C#

【讨论】:

我明白了,我必须在每个节点的前面添加 ns: 以告诉 xpath 我要查找的节点在我指定的命名空间中。我会试一试。谢谢。 @Shawn - 除非我遗漏了什么,否则您将ns 绑定到http://schemas.microsoft.com/taxonomy/2003/1,但您的文档使用http://schemas.microsoft.com/support/2003/02/config 命名空间。 我的命名空间错误。这就是问题所在。尊重命名空间!非常感谢。 好点。我会记住这一点。我已经接受了 lwburks 的回答,并且从这里开始我的所有帖子都会这样做。谢谢。【参考方案2】:

正如@lwburk 所说,您需要注册命名空间。

select 语句应该是:

var xmlNodeIterator = nav.Select("/ns:configuration/ns:name", nsmgr)

【讨论】:

以上是关于XPATH 帮助:使用 XPathNodeIterator 在命名空间中查找 XML 节点的主要内容,如果未能解决你的问题,请参考以下文章

如何在xpath中使用contains查找元素

XPath语法

如何为 XML 创建 XPath?

使用 xslt 2 从节点生成 xpath

找出XPath的工具[关闭]

使用 C# 在 Xpath 中查询元素