2010-08-20 18 views
6

Sto interrogando Sharepoint lato server e recuperando i risultati come Xml. Voglio ridimensionare l'Xml in qualcosa di più leggero prima di inviarlo a jQuery attraverso un WebMethod.Perché questa query XPath non restituisce alcun nodo?

Tuttavia, la mia query XPath non funziona. Ho pensato che il seguente codice avrebbe restituito tutti i nodi Document, ma non restituisce nulla. Ho usato XPath un po 'prima, pensavo che lo //Document facesse il trucco.

C# query XPath

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

XML interrogato

<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

L'XPath restituirebbe l Nodi 'Document' nel file XML di origine. Sei sicuro che siano lì e in tal caso sei sicuro che la variabile 'results' è vuota? – Oded

+0

La variabile stringa xml contiene l'XML mostrato sopra, ho aggiornato il mio codice sorgente con un commento per comunicare questo –

risposta

11

Stai cercando di selezionare Document elementi che non hanno uno spazio dei nomi ... mentre lo spazio dei nomi di default è in realtà "urna: Microsoft.Search.Response" qui.

Penso che si desidera qualcosa di simile:

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

questo trova due elementi.


Se è possibile utilizzare LINQ to XML invece che, rende il tutto un po 'più facile:

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

amo LINQ alla manipolazione dello spazio dei nomi di XML :)

+0

Ha uno spazio dei nomi aggiuntivo: 'urna: Microsoft.Search.Response.Document' – Oded

+0

Non ho esperienza con Xml namespace, qual è il prossimo passo? –

+0

@Peter: * sicuramente * vuoi utilizzare XPath qui? LINQ to XML renderebbe tutto più semplice, se è possibile utilizzarlo. –

3

In alternativa, si potrebbe provare il seguente e ignora gli spazi dei nomi:

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

Interessante - grazie per il suggerimento –

Problemi correlati