【问题标题】:Why doesn't this XPath query returns any nodes?为什么这个 XPath 查询不返回任何节点?
【发布时间】:2010-08-20 10:02:48
【问题描述】:

我正在查询 Sharepoint 服务器端并将结果作为 Xml 返回。在通过 WebMethod 将其发送到 jQuery 之前,我想将 Xml 精简为更轻量级的东西。

但是我的 XPath 查询不起作用。我认为下面的代码会返回所有 Document 节点,但它什么也不返回。我之前使用过 XPath,我认为 //Document 可以解决问题。

C# XPath 查询

XmlDocument xmlResults = new XmlDocument();
xmlResults.LoadXml(xml); // XML is a string containing the XML source shown below
XmlNodeList results = xmlResults.SelectNodes("//Document");

正在查询的 XML

<ResponsePacket xmlns="urn:Microsoft.Search.Response">
      <Response domain="QDomain">
            <Range>
                  <StartAt>1</StartAt>
                  <Count>2</Count>
                  <TotalAvailable>2</TotalAvailable>
                  <Results>
                        <Document relevance="126" xmlns="urn:Microsoft.Search.Response.Document">
                              <Title>Example 1.doc</Title>
                              <Action>
                                    <LinkUrl size="32256" fileExt="doc">http://hqiis99/Mercury/Mercury documents/Example 1.doc</LinkUrl>
                              </Action>
                              <Description />
                              <Date>2010-08-19T14:44:56+01:00</Date>
                        </Document>
                        <Document relevance="31" xmlns="urn:Microsoft.Search.Response.Document">
                              <Title>Mercury documents</Title>
                              <Action>
                                    <LinkUrl size="0" fileExt="aspx">http://hqiis99/mercury/Mercury documents/Forms/AllItems.aspx</LinkUrl>
                              </Action>
                              <Description />
                              <Date>2010-08-19T14:49:39+01:00</Date>
                        </Document>
                  </Results>
            </Range>
            <Status>SUCCESS</Status>
      </Response>
</ResponsePacket>

【问题讨论】:

  • XPath 将返回源 XML 文件中的所有 Document 节点。你确定它们在那里吗?如果是,你确定你的 results 变量是空的吗?
  • xml 字符串变量包含上面显示的 XML,我已经更新了我的源代码并添加了注释以传达这一点

标签: c# xml xpath


【解决方案1】:

您正在尝试选择没有命名空间的Document 元素...而默认命名空间实际上是“urn:Microsoft.Search.Response”。

我想你想要这样的东西:

XmlDocument xmlResults = new XmlDocument();
xmlResults.LoadXml(xml);
XmlNamespaceManager manager = new XmlNamespaceManager(xmlResults.NameTable);
manager.AddNamespace("ns", "urn:Microsoft.Search.Response.Document");
XmlNodeList results = xmlResults.SelectNodes("//ns:Document", manager);

这会找到两个元素。


如果你可以使用 LINQ to XML 代替,它会让这一切变得更容易:

XDocument results = XDocument.Parse(xml);
XNamespace ns = "urn:Microsoft.Search.Response.Document";
var documents = results.Descendants(ns + "Document");

我喜欢 LINQ to XML 的命名空间处理 :)

【讨论】:

  • 他有一个额外的命名空间:urn:Microsoft.Search.Response.Document
  • 我没有使用 Xml 命名空间的经验,下一步是什么?
  • @Peter:你肯定想在这里使用 XPath 吗?如果您可以使用 LINQ to XML,这会更容易。
  • @Jon-Skeet LINQ to XML 很好——我最初的想法是使用 XPath 会更容易:) 似乎不是!因此,请随时使用 LINQ to XML 示例更新您的答案,如果可行,我会接受。
  • @Oded:谢谢-我之前错过了,当它没有找到任何东西时感到困惑:(
【解决方案2】:

或者,您可以尝试以下方法并忽略命名空间:

XmlDocument xmlResults = new XmlDocument();
xmlResults.LoadXml(xmlString);
XmlNodeList results = xmlResults.SelectNodes("//*[local-name()='Document']");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    相关资源
    最近更新 更多