为什么这个XPath查询不返回任何节点?

时间:2010-08-20 10:02:48

标签: c# xml xpath

我正在查询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>

2 个答案:

答案 0 :(得分:11)

您正在尝试选择没有命名空间的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的命名空间处理:)

答案 1 :(得分:3)

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

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