0

我在寻找正确的 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 语法提出建议吗?

谢谢。

4

2 回答 2

1

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

选择语句应该是:

var xmlNodeIterator = nav.Select("/ns:configuration/ns:name", nsmgr)
于 2011-03-23T19:52:28.700 回答
1

我看不出您的 XPath 有什么问题,只是您从未注册文档节点所在的命名空间:

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

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

于 2011-03-23T19:30:53.117 回答