2010-08-20 18 views
6

Consulto el lado del servidor de Sharepoint y obtengo los resultados como Xml. Quiero adelgazar el Xml en algo más liviano antes de enviarlo a jQuery a través de un WebMethod.¿Por qué esta consulta XPath no devuelve ningún nodo?

Sin embargo, mi consulta XPath no está funcionando. Pensé que el siguiente código devolvería todos los nodos del documento, pero no devuelve nada. He usado XPath un poco antes, pensé //Document hacer el truco.

C# consulta XPath

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

XML que se consulta

<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

El XPath devolvería al l Nodos 'Document' en el archivo XML de origen. ¿Estás seguro de que están ahí y, de ser así, estás seguro de que la variable 'results' está vacía? – Oded

+0

La variable de cadena xml contiene el XML que se muestra arriba, he actualizado mi código fuente con un comentario para comunicar esto –

Respuesta

11

Usted está tratando de seleccionar Document elementos que no tienen un espacio de nombres ... mientras que el espacio de nombres predeterminado es en realidad "urn: Microsoft.Search.Response" aquí.

Creo que quieres algo como esto:

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

Esto encuentra dos elementos.


Si puede utilizar LINQ to XML en cambio, hace que sea aún algo más fácil:

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

Me encanta LINQ a la manipulación del espacio de nombres de XML :)

+0

Tiene un espacio de nombre adicional: 'urn: Microsoft.Search.Response.Document' – Oded

+0

No tengo experiencia con Xml espacios de nombres, ¿cuál es el siguiente paso? –

+0

@Peter: ¿* Definitivamente * quieres utilizar XPath aquí? LINQ to XML lo haría más fácil si puede usarlo. –

3

Alternativamente, puede probar lo siguiente e ignorar los espacios de nombres:

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

Interesante - gracias por la sugerencia –

Cuestiones relacionadas