2010-08-20 138 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

相關問題