He estado trabajando en el aprendizaje de algunas de las nuevas tecnología el uso de java para analizar los archivos y para el msot parte va muy bien. Sin embargo, estoy en una pérdida en cuanto a cómo podría analizar un archivo xml donde la estructura no es conocida en la recepción. Muchos ejemplos de cómo hacerlo si se conoce la estructura (getElementByTagName parece ser el camino a seguir), pero ninguna de las opciones dinámicas, al menos no que yo haya encontrado.

Por lo que el tl;dr versión de esta pregunta, ¿cómo puedo analizar un archivo xml donde no puedo confiar en el conocimiento de que la estructura?

  • Los analizadores de parseo del XML, sin preocuparse acerca de su estructura. El único requisito es que está bien formado. A menos que usted tenga una validación parser (donde el analizador también comparar el XML con un esquema que describe la estructura), se va a analizar el XML. Un método como getElementByTagName se llama en un modelo de objeto de la ya analizada XML. Tal vez usted quiere saber cómo leer los datos de un analizada modelo de objetos.
  • Se puede dar tal vez algún ejemplo? ¿Qué desea analizar de que la estructura desconocida? Se desconoce por completo o sólo una parte de ella?

1 Comentario

  1. 13

    Bien el análisis es sencillo; como helderdarocha indicado en los comentarios, el analizador sólo requiere XML válido, que no se preocupa de la estructura. Puede utilizar Java estándar de DocumentBuilder para obtener un Documento:

    InputStream in = new FileInputStream(...);
    Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in);

    (Si estás en el análisis de varios documentos, puede mantener la reutilización de la misma DocumentBuilder.)

    Entonces usted puede comenzar con la raíz del elemento de documento y familiar de uso de DOM métodos de allí en adelante:

    Element root = doc.getDocumentElement(); //perform DOM operations starting here.

    Como para su procesamiento, así que realmente depende de lo que quieras hacer con ella, pero puede utilizar los métodos de Nodo como getFirstChild() y getNextSibling() para iterar a través de los niños y de proceso, como se puede ver el ajuste basado en la estructura, etiquetas, y atributos.

    Considere el siguiente ejemplo:

    import java.io.ByteArrayInputStream;
    import java.io.InputStream;
    import javax.xml.parsers.DocumentBuilderFactory;   
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    public class XML {
    public static void main (String[] args) throws Exception {
    String xml = "<objects><circle color='red'/><circle color='green'/><rectangle>hello</rectangle><glumble/></objects>";
    //parse
    InputStream in = new ByteArrayInputStream(xml.getBytes("utf-8"));
    Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in);
    //process
    Node objects = doc.getDocumentElement();
    for (Node object = objects.getFirstChild(); object != null; object = object.getNextSibling()) {
    if (object instanceof Element) {
    Element e = (Element)object;
    if (e.getTagName().equalsIgnoreCase("circle")) {
    String color = e.getAttribute("color");
    System.out.println("It's a " + color + " circle!");
    } else if (e.getTagName().equalsIgnoreCase("rectangle")) {
    String text = e.getTextContent();
    System.out.println("It's a rectangle that says \"" + text + "\".");
    } else {
    System.out.println("I don't know what a " + e.getTagName() + " is for.");
    }
    }
    }
    }
    }

    El documento XML de entrada (codificada por ejemplo) es:

    <objects>
    <circle color='red'/>
    <circle color='green'/>
    <rectangle>hello</rectangle>
    <glumble/>
    </objects>

    La salida es:

    Es un círculo de color rojo! 
    Es un círculo verde! 
    Es un rectángulo que dice "hola". 
    No sé lo que es un glumble es para. 
    
    • Esto es más o menos lo que yo buscaba. Ayudó a abordar el elemento xml y su contenido de forma dinámica.
    • gracias por la amable respuesta

Dejar respuesta

Please enter your comment!
Please enter your name here