¿Cuál es la mejor biblioteca para el análisis XML en Java [cerrado]
Estoy buscando en la biblioteca Java para analizar XML (archivos de datos y configuración complejos), busqué en Google un poco pero no pude encontrar otra cosa que no sea dom4j (parece que están trabajando en V2). He mirado la configuración común pero no No me gusta, otros proyectos de Apache en XML parecen estar en hibernación. No he evaluado dom4j por mi cuenta, pero solo quería saber: ¿Java tiene otras (buenas) bibliotecas de análisis xml de código abierto? y ¿cómo es tu experiencia con dom4j?
Después de la respuesta de @Voo, déjame preguntarte otra: ¿Debería usar las clases integradas de Java o cualquier biblioteca de terceros como dom4j? ¿Cuáles son las ventajas?
En realidad, Java admite 4 métodos para analizar XML de forma inmediata:
Analizador/Constructor DOM: toda la estructura XML se carga en la memoria y puede utilizar los métodos DOM conocidos para trabajar con ella. DOM también le permite escribir en el documento con transformaciones Xslt. Ejemplo:
public static void parse() throws ParserConfigurationException, IOException, SAXException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
factory.setIgnoringElementContentWhitespace(true);
DocumentBuilder builder = factory.newDocumentBuilder();
File file = new File("test.xml");
Document doc = builder.parse(file);
// Do something with the document here.
}
Analizador SAX: Únicamente para leer un documento XML. El analizador Sax recorre el documento y llama a los métodos de devolución de llamada del usuario. Existen métodos para el inicio/final de un documento, elemento, etc. Están definidos en org.xml.sax.ContentHandler y hay una clase auxiliar vacía DefaultHandler.
public static void parse() throws ParserConfigurationException, SAXException {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
SAXParser saxParser = factory.newSAXParser();
File file = new File("test.xml");
saxParser.parse(file, new ElementHandler()); // specify handler
}
StAx Reader/Writer: funciona con una interfaz orientada al flujo de datos. El programa solicita el siguiente elemento cuando está listo como un cursor/iterador. También puedes crear documentos con él. Leer documento:
public static void parse() throws XMLStreamException, IOException {
try (FileInputStream fis = new FileInputStream("test.xml")) {
XMLInputFactory xmlInFact = XMLInputFactory.newInstance();
XMLStreamReader reader = xmlInFact.createXMLStreamReader(fis);
while(reader.hasNext()) {
reader.next(); // do something here
}
}
}
Escribir documento:
public static void parse() throws XMLStreamException, IOException {
try (FileOutputStream fos = new FileOutputStream("test.xml")){
XMLOutputFactory xmlOutFact = XMLOutputFactory.newInstance();
XMLStreamWriter writer = xmlOutFact.createXMLStreamWriter(fos);
writer.writeStartDocument();
writer.writeStartElement("test");
// write stuff
writer.writeEndElement();
}
}
JAXB: La implementación más nueva para leer documentos XML: Es parte de Java 6 en v2. Esto nos permite serializar objetos java desde un documento. Lee el documento con una clase que implementa una interfaz para javax.xml.bind.Unmarshaller (obtiene una clase para esto de JAXBContext.newInstance). El contexto debe inicializarse con las clases utilizadas, pero solo debe especificar las clases raíz y no debe preocuparse por las clases referenciadas estáticas. Usas anotaciones para especificar qué clases deben ser elementos (@XmlRootElement) y qué campos son elementos(@XmlElement) o atributos (@XmlAttribute, ¡qué sorpresa!)
public static void parse() throws JAXBException, IOException {
try (FileInputStream adrFile = new FileInputStream("test")) {
JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
Unmarshaller um = ctx.createUnmarshaller();
RootElementClass rootElement = (RootElementClass) um.unmarshal(adrFile);
}
}
Escribir documento:
public static void parse(RootElementClass out) throws IOException, JAXBException {
try (FileOutputStream adrFile = new FileOutputStream("test.xml")) {
JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
Marshaller ma = ctx.createMarshaller();
ma.marshal(out, adrFile);
}
}
Ejemplos copiados descaradamente de algunas diapositivas antiguas de conferencias ;-)
Editar: Acerca de "¿qué API debo usar?". Bueno, depende: no todas las API tienen las mismas capacidades que ves, pero si tienes control sobre las clases que usas para mapear el documento XML, JAXB es mi solución favorita, realmente elegante y simple (aunque no la he usado durante mucho tiempo). documentos muy grandes, podría volverse un poco complejo). SAX también es bastante fácil de usar y manténgase alejado de DOM si no tiene una buena razón para usarlo: en mi opinión, una API antigua y torpe. No creo que existan bibliotecas modernas de terceros que presenten algo especialmente útil que falta en STL y las bibliotecas estándar tienen las ventajas habituales de estar extremadamente bien probadas, documentadas y estables.
Java admite dos métodos para el análisis XML listos para usar.
SAXParser
Puede utilizar este analizador si desea analizar archivos XML grandes y/o no desea utilizar mucha memoria.
http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/SAXParserFactory.html
Ejemplo: http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/
Analizador DOMP
Puede utilizar este analizador si necesita realizar consultas XPath o si necesita tener disponible el DOM completo.
http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilderFactory.html
Ejemplo: http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/
Si desea una API similar a DOM, es decir, una en la que el analizador XML convierta el documento en un árbol de nodos de elementos y atributos, entonces hay al menos cuatro para elegir: el propio DOM, JDOM, DOM4J y XOM. La única razón posible para usar DOM es porque se percibe como un estándar y se proporciona en el JDK: en todos los demás aspectos, los demás son todos superiores. Mi preferencia, por su combinación de simplicidad, potencia y rendimiento, es XOM.
Y, por supuesto, existen otros estilos de procesamiento: interfaces de analizador de bajo nivel (SAX y StAX), interfaces de enlace de objetos de datos (JAXB) y lenguajes declarativos de alto nivel (XSLT, XQuery, XPath). Cuál es mejor para usted depende de los requisitos de su proyecto y de su gusto personal.
El punto de Nikita es excelente: no confundas lo maduro con lo malo. XML no ha cambiado mucho.
JDOM sería otra alternativa a DOM4J.