2010-08-20 11 views
6

Ich Abfrage Sharepoint Server-Seite und die Ergebnisse im XML-Format immer wieder. Ich möchte das Xml in etwas Leichterem abnehmen, bevor ich es über eine WebMethod an jQuery sende.Warum gibt diese XPath-Abfrage keine Knoten zurück?

jedoch meine XPath-Abfrage funktioniert nicht. Ich dachte, der folgende Code würde alle Document-Knoten zurückgeben, aber nichts zurückgeben. Ich habe XPath ein wenig vorher verwendet, ich dachte //Document den Trick.

C# XPath-Abfrage

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

XML abgefragten

<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

Die XPath würde al zurückkehren l 'Document'-Knoten in der Quell-XML-Datei. Sind Sie sicher, dass sie da sind und wenn ja, sind Sie sicher, dass Ihre Variable 'results' leer ist? – Oded

+0

Die XML-String-Variable enthält die XML oben gezeigt, ich habe mit einem Kommentar meinem Quellcode aktualisiert, um diese –

Antwort

11

Sie versuchen Document Elemente auszuwählen, die ..., während die Standard-Namespace keinen Namespace ist eigentlich "urn: Microsoft.Search.Response" hier.

Ich glaube, Sie so etwas wie dies wollen:

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

Dies findet zwei Elemente.


Wenn Sie LINQ stattdessen XML verwenden können, ist es alles etwas einfacher macht:

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

ich LINQ to XML-Namespace Handhabung lieben :)

+0

zu kommunizieren Er hat einen zusätzlichen Namespace: 'urn: Microsoft.Search.Response.Document' – Oded

+0

ich keine Erfahrung mit Xml haben Namespaces, was ist der nächste Schritt? –

+0

@Peter: Wollen Sie * definitiv * XPath hier verwenden? LINQ to XML würde dies vereinfachen, wenn Sie das verwenden können. –

3

Alternativ können Sie versuchen, die folgenden und ignorieren die Namensräume:

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

Interessant -. danke für den Tipp –

Verwandte Themen