2010-08-20 103 views
6

我在查询Sharepoint服务器端并获取结果作为Xml。我希望通过WebMethod将其发送到jQuery之前,将Xml细化为更轻量级的东西。为什么这个XPath查询不返回任何节点?

但是我的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> 
+0

XPath将返回al l源XML文件中的'Document'节点。你确定他们在那里,如果是的话,你确定你的结果变量是空的吗? – Oded 2010-08-20 10:05:31

+0

XML字符串变量包含上面显示的XML,我已经更新了我的源代码的注释沟通这个 – 2010-08-20 10:07:42

回答

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而不是XML,这使得它比较容易:

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

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

+0

他有一个额外的命名空间:'瓮:Microsoft.Search.Response.Document' – Oded 2010-08-20 10:09:41

+0

我已经有了XML没有经验命名空间,下一步是什么? – 2010-08-20 10:10:14

+0

@Peter:你确实*想在这里使用XPath吗?如果可以使用,LINQ to XML将使这更容易。 – 2010-08-20 10:11:47

3

或者,你可以尝试以下并忽略名称空间:

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

有趣的 - 谢谢你的提示 – 2010-08-26 11:06:24

相关问题