2010-08-20 10 views
6

Pytam strony serwera Sharepoint i zwracam wyniki jako Xml. Chcę odchudzić Xml do czegoś bardziej lekkiego przed wysłaniem go do jQuery za pośrednictwem WebMethod.Dlaczego to zapytanie XPath nie zwraca żadnych węzłów?

Jednak moje zapytanie XPath nie działa. Myślałem, że poniższy kod zwróci wszystkie węzły dokumentu, ale nic nie zwróci. Użyłem XPath trochę wcześniej, myślałem, że //Document zrobić lewy.

C# kwerend XPath

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

XML są pytani

<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 zwróci al l 'Dokument' węzłów w źródłowym pliku XML. Jesteś pewien, że tam są, a jeśli tak, czy jesteś pewien, że twoja zmienna "wyniki" jest pusta? – Oded

+0

Zmienna łańcuchowa xml zawiera powyższy kod XML, zaktualizowałem swój kod źródłowy, dodając komentarz do komunikowania się z tym –

Odpowiedz

11

Próbujesz wybrać Document elementy, które nie mają nazw ... natomiast domyślnej przestrzeni nazw jest faktycznie "urn: Microsoft.Search.Response" tutaj.

Myślę, że chcesz coś takiego:

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); 

Znajduje to dwa elementy.


Jeśli można użyć LINQ do XML zamiast, to czyni to wszystko nieco łatwiejsze:

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

kocham LINQ do obsługi przestrzeni nazw XML :)

+0

Ma on dodatkowy obszar nazw: 'urn: Microsoft.Search.Response.Document' – Oded

+0

Nie mam doświadczenia z Xml przestrzenie nazw, jaki jest następny krok? –

+0

@Peter: Czy * zdecydowanie * chcesz używać XPath tutaj? LINQ to XML ułatwiłoby to, jeśli możesz z niego korzystać. –

3

Alternatywnie, można spróbować następujące i zignoruj ​​przestrzenie nazw:

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

Interesujące - dzięki za wskazówkę –

Powiązane problemy