Cómo leer y escribir archivos XML con código

Cómo leer y escribir archivos XML con código / Programación

¿Te gustaría aprender a leer y escribir un archivo XML desde Java??

Los archivos XML se utilizan para una variedad de propósitos, incluido el almacenamiento de datos. Antes de que JSON se hiciera popular, XML era el formato preferido para representar, almacenar y transportar datos estructurados. Aunque la popularidad de XML ha disminuido en los últimos años, es posible que lo encuentre ocasionalmente, por lo que es importante aprender a trabajar con él desde el código.

Java Standard Edition (SE) 10 Conceptos básicos de Java que debe aprender al comenzar 10 Conceptos básicos de Java que debe aprender al comenzar Ya sea que esté escribiendo una GUI, desarrollando software de servidor o una aplicación móvil con Android, aprenderá Java tu bien. Aquí hay algunos conceptos básicos de Java para ayudarte a comenzar. Leer más incluye el API de Java para procesamiento XML (JAXP), que es un término general que cubre la mayoría de los aspectos del procesamiento XML. Éstos incluyen:

  • DOM: El Modelo de objetos de documento incluye clases para trabajar con artefactos XML como elementos, nodos, atributos, etc. La API DOM carga el documento XML completo en la memoria para su procesamiento, por lo que no es muy adecuado para trabajar con archivos XML grandes.
  • SAXÓFONO: La API simple para XML es un algoritmo controlado por eventos para leer XML. Aquí el XML se procesa mediante la activación de eventos encontrados al leer XML. Los requisitos de memoria para usar este método son bajos, pero trabajar con la API es más complejo que trabajar con el DOM.
  • StAX: Streaming API para XML es una adición reciente a las API XML y proporciona un filtrado, procesamiento y modificación de XML de alto rendimiento. Si bien evita cargar todo el documento XML en la memoria, proporciona una arquitectura de tipo pull en lugar de una arquitectura controlada por eventos, por lo que la aplicación es más fácil de codificar y entender que el uso de la API de SAX..

En este artículo, utilizamos el API DOM para demostrar cómo leer y escribir archivos XML desde java. Cubriremos las otras dos API en futuros artículos..

Un archivo XML de muestra

Para los fines de este artículo, demostramos los conceptos utilizando el siguiente ejemplo de XML, que se puede encontrar aquí:

   Gambardella, matthew Guía del desarrollador de XML Computadora 44.95 2000-10-01 Una mirada en profundidad a la creación de aplicaciones con XML.   Ralls, Kim... 

Leyendo un archivo XML

Veamos los pasos básicos necesarios para leer un archivo XML utilizando la API DOM.

El primer paso es obtener una instancia de DocumentBuilder. El constructor se utiliza para analizar documentos XML. Para uso básico, lo hacemos así:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance (); factory.setNamespaceAware (false); factory.setValidating (false); DocumentBuilder builder = factory.newDocumentBuilder (); 

Ahora podemos cargar todo el documento en la memoria a partir del elemento raíz XML. En nuestro ejemplo, es el catalogar elemento.

Archivo de archivo =…; // archivo XML para leer Documento de documento = builder.parse (archivo); Catálogo de elementos = document.getDocumentElement (); 

Y eso es todo, amigos! La API DOM para leer un XML es realmente simple. Ahora tiene acceso a todo el documento XML a partir de su elemento raíz, catalogar. Veamos ahora cómo trabajar con él..

Usando la API DOM

Ahora que tenemos la raíz XML Elemento, Podemos usar la API DOM para extraer interesantes pepitas de información.

Obtener todos los libro Hijos del elemento raíz y bucles sobre ellos. Tenga en cuenta que getChildNodes () devoluciones todos niños, incluido texto, comentarios, etc. Para nuestro propósito, solo necesitamos los elementos secundarios, así que saltamos los demás.

NodeList books = catalog.getChildNodes (); para (int i = 0, ii = 0, n = books.getLength (); i < n ; i++)  Node child = books.item(i); if ( child.getNodeType() != Node.ELEMENT_NODE ) continue; Element book = (Element)child; // work with the book Element here  

¿Cómo encuentras un elemento secundario específico, dado el padre? El siguiente método estático devuelve el primer elemento coincidente si se encuentra, o nulo. Como puede ver, el procedimiento implica obtener la lista de nodos secundarios y recorrerlos seleccionando los nodos de elementos con el nombre especificado.

Nodo privado estático findFirstNamedElement (Nodo primario, String tagName) NodeList children = parent.getChildNodes (); para (int i = 0, in = children.getLength (); i < in ; i++)  Node child = children.item(i); if ( child.getNodeType() != Node.ELEMENT_NODE ) continue; if ( child.getNodeName().equals(tagName) ) return child;  return null;  

Tenga en cuenta que la API DOM trata el contenido de texto dentro de un elemento como un nodo de tipo separado TEXT_NODE. Además, el contenido del texto puede dividirse en varios nodos de texto adyacentes. Por lo tanto, se requiere el siguiente procesamiento especial para recuperar el contenido de texto dentro de un elemento.

String privado String getCharacterData (nodo principal) StringBuilder text = new StringBuilder (); if (parent == null) devuelve text.toString (); NodeList children = parent.getChildNodes (); para (int k = 0, kn = children.getLength (); k < kn ; k++)  Node child = children.item(k); if ( child.getNodeType() != Node.TEXT_NODE ) break; text.append(child.getNodeValue());  return text.toString();  

Armados con estas funciones de conveniencia, veamos ahora algunos códigos para enumerar información de nuestro ejemplo de XML. Nos gustaría mostrar información detallada de cada libro, tal como estaría disponible en un catálogo de libros..

NodeList books = catalog.getChildNodes (); para (int i = 0, ii = 0, n = books.getLength (); i < n ; i++)  Node child = books.item(i); if ( child.getNodeType() != Node.ELEMENT_NODE ) continue; Element book = (Element)child; ii++; String id = book.getAttribute("id"); String author = getCharacterData(findFirstNamedElement(child,"author")); String title = getCharacterData(findFirstNamedElement(child,"title")); String genre = getCharacterData(findFirstNamedElement(child,"genre")); String price = getCharacterData(findFirstNamedElement(child,"price")); String pubdate = getCharacterData(findFirstNamedElement(child,"pubdate")); String descr = getCharacterData(findFirstNamedElement(child,"description")); System.out.printf("%3d. book id = %s\n" + " author: %s\n" + " title: %s\n" + " genre: %s\n" + " price: %s\n" + " pubdate: %s\n" + " descr: %s\n", ii, id, author, title, genre, price, pubdate, descr);  

Escritura de salida XML

Java proporciona el API Tranform de XML para transformar los datos XML. Utilizamos esta API con el transformación de identidad para generar salida.

Como ejemplo, vamos a añadir una nueva libro Elemento al catálogo de muestra presentado anteriormente. Los detalles del libro (tales como autor, título, etc) pueden obtenerse externamente, tal vez de un archivo de propiedades o una base de datos. Usamos el siguiente archivo de propiedades para cargar los datos..

id = bk113 author = Jane Austen title = Orgullo y prejuicio genre = Romance price = 6.99 publish_date = 2010-04-01 description = "Es una verdad reconocida universalmente, que un solo hombre en posesión de una buena fortuna debe estar en necesidad una esposa." Así comienza Pride and Prejudice, la ingeniosa comedia de modales de Jane Austen, una de las novelas más populares de todos los tiempos, que presenta un combate espléndidamente civilizado entre el orgulloso Sr. Darcy y la prejuiciada Elizabeth Bennet mientras juegan su animado noviazgo en una serie de Intrigas del salón del siglo XVIII.. 

El primer paso es analizar el archivo XML existente utilizando el método presentado anteriormente. El código también se muestra a continuación.

Archivo de archivo =…; // archivo XML para leer Documento de documento = builder.parse (archivo); Catálogo de elementos = document.getDocumentElement (); 

Nosotros cargamos los datos del archivo de propiedades usando el Propiedades Clase provista de java. El código es bastante simple y se muestra a continuación..

String propsFile =…; Propiedades props = propiedades nuevas (); try (FileReader in = new FileReader (propsFile)) props.load (in);  

Una vez que se cargan las propiedades, recuperamos los valores que queremos agregar del archivo de propiedades.

String id = props.getProperty ("id"); String author = props.getProperty ("author"); String title = props.getProperty ("title"); Género de cadena = props.getProperty ("género"); String price = props.getProperty ("price"); String publish_date = props.getProperty ("publish_date"); String descr = props.getProperty ("description"); 

Creamos ahora un vacío. libro elemento.

Elemento de libro = document.createElement ("libro"); book.setAttribute ("id", id); 

Añadiendo los elementos hijos a la libro es trivial Para mayor comodidad, recopilamos los nombres de elementos requeridos en un Lista y agregar los valores en un bucle.

Lista elnames = Arrays.asList ("author", "title", "genre", "price", "publish_date", "description"); para (String elname: elnames) Elemento el = document.createElement (elname); Text text = document.createTextNode (props.getProperty (elname)); el.appendChild (texto); book.appendChild (el);  catalog.appendChild (libro); 

Y así se hace. los catalogar elemento ahora tiene el nuevo libro elemento añadido. Todo lo que queda ahora es escribir el XML actualizado.

Para escribir el XML, necesitamos una instancia de Transformador que se crea como se muestra a continuación. Tenga en cuenta que solicitamos la sangría del XML de salida utilizando el setOutputProperty () método.

TransformerFactory tfact = TransformerFactory.newInstance (); Transformador tform = tfact.newTransformer (); tform.setOutputProperty (OutputKeys.INDENT, "yes"); tform.setOutputProperty ("http://xml.apache.org/xsltindent-amount", "3"); 

El último paso para generar la salida XML es aplicar la transformación. El resultado aparece en el flujo de salida., Sistema.out.

tform.transform (nuevo DOMSource (documento), nuevo StreamResult (System.out)); 

Para escribir la salida directamente en un archivo, use lo siguiente.

tform.transform (nuevo DOMSource (documento), nuevo StreamResult (nuevo Archivo ("output.xml"))); 

Y eso concluye este artículo sobre la lectura y escritura de archivos XML utilizando la API DOM.

¿Has usado la API DOM en tus aplicaciones? ¿Cómo se realizó? Por favor háznoslo saber en los comentarios más abajo.

Explorar más sobre: ​​Java.