jueves, 31 de enero de 2008

    Parseando un XML en Java

    Tengo que parsear unos cuantos XML. Por lo que veo los XML van a ser muy muy simples, no van a formar ramificaciones raras y van a venir construidos. Básicamente quería un código sencillo para coger el valor de un campo de un XML.

    Para este menester parece que se recomienda utilizar DOM en vez de SAX...(*) no me he metido mucho en las diferencias entre ambos, sencillamente he ido a por un código que me funcione:



    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

    //Using factory get an instance of document builder
    DocumentBuilder db = dbf.newDocumentBuilder();
    //parse using builder to get DOM representation of the XML file
    dom = db.parse(xmlDoc.getStream());

    Element docEle = dom.getDocumentElement();
    NodeList nl = docEle.getElementsByTagName("Id");
    if (nl != null && nl.getLength() == 1) {
    Element item = (Element) nl.item(0);
    String id = item.getFirstChild().getNodeValue();
    }



    syntax highlighted by Code2HTML, v. 0.9.1


    Los pasos son:
    • Obtener una instancia de "document builder"
    • Parsear el texto. En mi caso me venía bien un InputStream.
    • Acceder al elemento "documento", que es el documento en sí mismo.
    • Pedirle la tag a la que queremos acceder.
    • Ir leyendo lo que nos han devuelto y tratarlo apropiadamente.
    Este enlace me fue de gran utilidad.

    Act: Me comenta Sebas que no... que es más eficiente SAX pero que al usar una aproximación por callbacks puede resultar extraño. En fin, lo hecho, hecho está.

    1 comentario:

    Sebastián Ortega dijo...

    Siento llevarte la contraria, pero para coger el valor de un sólo campo de un XML creo que es más sencillo y eficiente usar SAX.

    Con SAX recibes unos callbacks muy similares a la ejecución de acciones semánticas cuando construyes un compilador. Conceptos que pueden resultar extraños para alguien que no está familiarizado con los mismos y que prefiere recorrer la estructura en árbol que proporciona DOM.

    De todas formas, suerte y un abrazo!