c# - regulares - xpath and xslt
¿Por qué esta consulta XPath no devuelve ningún nodo? (2)
Estoy consultando Sharepoint en el lado del servidor y obteniendo resultados como Xml. Quiero adelgazar el Xml en algo más liviano antes de enviarlo a jQuery a través de un WebMethod.
Sin embargo, mi consulta XPath no funciona. 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.
Consulta de 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 siendo consultado
<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>
Alternativamente, podría intentar lo siguiente e ignorar los espacios de nombres:
XmlDocument xmlResults = new XmlDocument();
xmlResults.LoadXml(xmlString);
XmlNodeList results = xmlResults.SelectNodes("//*[local-name()=''Document'']");
Está intentando seleccionar elementos del Document
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 usar LINQ to XML en su lugar, lo hace todo más fácil:
XDocument results = XDocument.Parse(xml);
XNamespace ns = "urn:Microsoft.Search.Response.Document";
var documents = results.Descendants(ns + "Document");
Me encanta el manejo del espacio de nombres de LINQ to XML :)