4 de Septiembre 2003

Consultas XPath

El parser XML con el que estoy más familiarizado sigue siendo MSXML, sorprendente ¿no?

Tiene una explicación, en .NET vemos XML en todos sitios (ficheros de configuración, DataSets, esquemas...)
pero siempre encuntras unas clases que te abstraen de la tediosa tarea de masticar el XML.

Hoy ha sido el primer día que me he visto en la necesidad de consultar un stream XML, ha costado un
poco, sobre todo por que los Namespaces que definian el documento.

El documento:

<br /> <?xml version="1.0" encoding="utf-8" ?><br /> <soap:Envelope xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing" <br /> xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility"<br /> xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><br /> <soap:Header>....</soap:Header><br /> <soap:Body><br /> <soap:Fault><br /> <faultcode xmlns:code="http://schemas.xmlsoap.org/ws/2002/12/secext"><br /> code:FailedCheck<br /> </faultcode><br /> <faultstring><br /> ..The signature or decryption was invalid at..<br /> </faultstring><br /> <faultactor>http://localhost/RidoCode.WSEDemos.Web/HRSystem.asmx</faultactor><br /> </soap:Fault><br /> </soap:Body><br /> </soap:Envelope><br />

Obtener el contenido del nodo faultcode con MSXML es tan sencillo como

 Public Function parseSoapFault(xml as String) as String
 ···Dim doc as new MSXML.DOMDocument
 ···Dim node as MSXML.IXMLNode
 ···doc.loadXml(xml)
 ···node = selectSingleNode("/soap:Envelope/soap:Body/soap:Fault/faultcode")
 ...parseSoapFault = node.value
 End Public
 

Lo que no me gusta de este método es que necesito guardar todo el DOM en memoria,
igual que si fuese a modificar el documento, con System.Xml tenemos otra alternativa,
que se basa en usar la clase XPathNavigator para poder cargar el DOM en modo
sólo lectura. Además en vez de trabajar con strings cargamos el documento
directamente desde un Stream. Este el código resultante:

 public static string parseSoapFault(Stream responseStream)
 {
 	string result = String.Empty;
 	XPathDocument doc = new XPathDocument(responseStream);
 	XPathNavigator nav = doc.CreateNavigator();
 	XPathExpression expr = nav.Compile("/soap:Envelope/soap:Body/soap:Fault/faultcode");
 	XmlNamespaceManager context = new XmlNamespaceManager(nav.NameTable);
 	context.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
 	expr.SetContext(context);
 	XPathNodeIterator iter = nav.Select(expr);
 	iter.MoveNext();
 	result = iter.Current.Value;
 	responseStream.Close();			
 	return result;	
 }
 
Posted by rido at 4 de Septiembre 2003 a las 09:35 AM
Comments

Este tipo de cosas las haces en cliente, no?

siempre me parecio un poco jevy lo de dejar tus funciones vbscript para toquetear XML y que las puedan leer otros... :P

Posted by: Joshua on 4 de Septiembre 2003 a las 01:35 PM

este codigo es c#, y se compila. Yo no veo el problema de mostrar como se "busca" en el XML, al fin y al cabo es como ver un estructura de carpetas y querer ocultar el PATH al hacer 'ls'

Posted by: rido on 5 de Septiembre 2003 a las 11:28 PM

Arguendo - For the sake of argument

Posted by: zoosexual on 10 de Julio 2004 a las 05:45 PM

Prehende uxorem meam, sis! - Take my wife, please!

Posted by: bestiality galleries on 11 de Julio 2004 a las 02:06 AM

Inter vivos - Living

Posted by: escorts older woman on 19 de Julio 2004 a las 09:25 PM

Liberate Te Ex Inferis - Save yourself from hell

Posted by: free teen webcam sites on 27 de Julio 2004 a las 05:57 AM

Audi et alteram partem - Hear the other side too

Posted by: teen panty hose on 4 de Agosto 2004 a las 08:57 AM

Cras amet qui nunquam amavit; Quique amavit, cras amet - May he love tomorrow who has never loved before

Posted by: girls drunk shirt wet on 5 de Agosto 2004 a las 04:37 AM
Post a comment