lunes, 29 de junio de 2009

Leer un nodo XML con Xpath

El mundo de .NET es simplemente inabarcable. Pero hace unos meses me encontré delante de la pantalla de un ordenador intentando superar una prueba que se trataba justamente de lo que se trata en este post.
Es decir leer el atributo de un nodo específico de un fichero xml. Tengo un xml tal cual:

<Configuracion>
  <PresentacionDatosEspecificos>
    <PresentacionWeb cifEmisor="CIF del emisor UNO" />
    <PresentacionWeb cifEmisor="CIF del emisor DOS" />
  </PresentacionDatosEspecificos>
</Configuracion>

Y quiero leer el atributo “cifEmisor” de los nodos PresentacionWeb.

Mi primer camino, y el que mi experiencia me indicó como el más rápido, es usar el metodo readXML de un dataset. Esta función devuelve una tabla con los nodos PresentacionWeb, con los cuales puedo hacer lo que quiera. Muy interesante si se va a visualizar en un GridView.

public DataTable lectorXMLDataSet(string file_path)
{
    DataSet ds = new DataSet();
    ds.ReadXml(file_path);
    return ds.Tables["PresentacionWeb"];
}

Pero, para no cargar todo todo el xml en memoria, puedo utilizar XPath. Que es mucho más rápido en la lectura, me permite acceso aleatorio a los nodos de un xml y realizar búsquedas por patrones complejos.

public void lectorXMLPath(string file_path)
{
    XPathDocument doc = new XPathDocument(file_path);
    XPathNavigator nav = doc.CreateNavigator();

    Response.Write("Listado de nodos <br/>");
    foreach (XPathNavigator node in nav.Select("//PresentacionWeb"))
        Response.Write (node.GetAttribute("cifEmisor",string.Empty) + "<br/>");
}


Algún día probare LinqToXML y os contaré qué tal va… :)

3 comentarios:

John Ortiz Ordoñez dijo...

Hola,


¿Sabes cómo hacer esto mismo, pero desde Java?


Gracias.

Juan Quijano dijo...

Lo siento, pero no. Aunque, teniendo en cuenta que .Net está muy basado en los espacios de nombre de Java, no debería ser muy diferente.

kenley dijo...

Nice Post!