CodeGym /Blog Java /Random-ES /XML en Java
Autor
John Selawsky
Senior Java Developer and Tutor at LearningTree

XML en Java

Publicado en el grupo Random-ES
¡Hola! Hoy presentaremos otro formato de datos llamado XML. Este es un tema muy importante. Cuando trabaje en aplicaciones Java reales, es casi seguro que encontrará tareas relacionadas con XML. En el desarrollo de Java, este formato se usa casi universalmente (veremos por qué a continuación), por lo que le recomiendo que no revise esta lección superficialmente, sino que obtenga una comprensión profunda de todo y también estudie literatura/enlaces adicionales :) Esto definitivamente no será una pérdida de tiempo. Entonces, comencemos con las cosas fáciles: ¡el "qué" y el "por qué"!

¿Qué es JavaXML?

XML significa lenguaje de marcado extensible. Es posible que ya esté familiarizado con un lenguaje de marcado: ¿ha oído hablar de HTML, que se utiliza para crear páginas web :) ¿Qué es XML?  - 1HTML y XML incluso tienen una apariencia similar:
HTML 1

<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML1

<headline>title</headline>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
HTML 2

<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML2

<chief>title</chief>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
En otras palabras, XML es un lenguaje para describir datos.

¿Por qué necesita XML?

XML se inventó originalmente para almacenar y enviar datos de manera más conveniente, incluso a través de Internet. Tiene varias ventajas que te ayudan a conseguirlo. Primero, es fácil de leer tanto por un humano como por una computadora. Creo que puedes entender fácilmente lo que describe este archivo XML:

<?xml version="1.0" encoding="UTF-8"?>
<book>
   <title>Harry Potter and the Philosopher’s Stone</title>
   <author>J. K. Rowling</author>
   <year>1997</year>
</book>
Una computadora también entiende fácilmente este formato. En segundo lugar, dado que los datos se almacenan como texto sin formato, no habrá problemas de compatibilidad cuando los transfiramos de un ordenador a otro. Es importante comprender que XML no es un código ejecutable, es un lenguaje de descripción de datos. Después de describir los datos mediante XML, debe escribir un código (por ejemplo, en Java) que pueda enviar/recibir/procesar estos datos.

¿Cómo está estructurado XML?

El componente principal son las etiquetas: estas son las cosas entre paréntesis angulares:

<book>
</book>
Hay etiquetas de apertura y etiquetas de cierre. La etiqueta de cierre tiene un símbolo adicional (" / "), como se puede ver en el ejemplo anterior. Cada etiqueta de apertura debe tener una etiqueta de cierre. Muestran dónde comienza y termina la descripción de cada elemento del archivo. ¡Las etiquetas se pueden anidar! En nuestro ejemplo de libro, la etiqueta <libro> tiene 3 etiquetas anidadas: <título>, <autor> y <año>. Esto no se limita a un nivel de anidamiento: las etiquetas anidadas pueden tener sus propias etiquetas anidadas, etc. Esta estructura se denomina árbol de etiquetas. Veamos este árbol usando un archivo XML de muestra que describe un concesionario de automóviles:

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
Aquí tenemos una etiqueta de nivel superior: <carstore>. También se le llama elemento raíz. <carstore> tiene una etiqueta secundaria: <car>. <auto>, a su vez, también tiene 3 etiquetas secundarias: <modelo>, <año> y <precio>. Cada etiqueta puede tener atributos, que contienen información importante adicional. En nuestro ejemplo, la etiqueta <model> tiene un atributo "lang", que indica el idioma utilizado para registrar el nombre del modelo:

<model lang="en">Scania R 770</model>
Aquí indicamos que el nombre está escrito en inglés. Nuestra etiqueta <price> tiene un atributo de "moneda".

<price currency="US dollar">150000.00</price>
Aquí indicamos que el precio del auto está dado en dólares americanos. Por lo tanto, XML tiene una sintaxis "autodescriptiva". Puede agregar cualquier información que necesite para describir los datos. Además, en la parte superior del archivo, puede agregar una línea que indique la versión XML y la codificación utilizada para escribir los datos. Esto se llama el "prólogo" y se ve así:

<?xml version="1.0" encoding="UTF-8"?>
Usamos XML versión 1.0 y codificación UTF-8. Esto no es necesario, pero puede ser útil si, por ejemplo, su archivo usa texto en diferentes idiomas. Mencionamos que XML significa "lenguaje de marcado extensible", pero ¿qué significa "extensible"? Esto significa que es perfecto para crear nuevas versiones de tus objetos y archivos. Por ejemplo, supongamos que también queremos comenzar a vender motocicletas en nuestro concesionario de automóviles. Dicho esto, necesitamos que nuestro programa admita ambas versiones de <carstore>: la antigua (sin motocicletas) y la nueva. Aquí está nuestra versión anterior:

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
Y aquí está el nuevo ampliado:

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
   <motorcycle>
       <title lang="en">Yamaha YZF-R6</title>
       <year>2018</year>
       <price currency="Russian Ruble">1000000.00</price>
       <owner>Vasia</owner>
   </motorcycle>
   <motorcycle>
       <title lang="en">Harley Davidson Sportster 1200</title>
       <year>2011</year>
       <price currency="Euro">15000.00</price>
       <owner>Petia</owner>
   </motorcycle>
</carstore>
Así de fácil y simple es agregar una descripción de motocicletas a nuestro archivo :) Además, no necesitamos en absoluto tener las mismas etiquetas secundarias para motocicletas que para automóviles. Tenga en cuenta que las motocicletas, a diferencia de los automóviles, tienen un elemento <propietario>. Esto no evita que la computadora (o el ser humano) lea los datos.

Diferencias entre XML y HTML

Ya hemos dicho que XML y HTML son muy similares en apariencia. Eso hace que sea muy importante saber en qué se diferencian. En primer lugar, se utilizan para diferentes propósitos. HTML es para marcar páginas web. Por ejemplo, al crear un sitio web, puede usar HTML para especificar: "El menú debe estar en la esquina superior derecha. Debe tener tales y tales botones". En otras palabras, el trabajo de HTML es mostrar datos. XML es para almacenar y enviar información en una forma conveniente para humanos y computadoras. Este formato no contiene ninguna indicación de cómo se deben mostrar estos datos: eso depende del código del programa que los lea. En segundo lugar, hay una gran diferencia técnica. Las etiquetas HTML están predefinidas. En otras palabras, crear un encabezado HTML (por ejemplo, un título grande en la parte superior de la página) usa solo <h1></h1> etiquetas (<h2></h2> y <h3></h3> se utilizan para encabezados más pequeños). No puede crear encabezados HTML usando otras etiquetas. XML no utiliza etiquetas predefinidas. Puede dar a las etiquetas el nombre que desee: <header>, <title>, <idontknow2121>.

La resolución de conflictos

La libertad que brinda XML puede generar algunos problemas. Por ejemplo, una misma entidad (por ejemplo, un automóvil) puede ser utilizada por un programa para diferentes propósitos. Por ejemplo, tenemos un archivo XML que describe automóviles. Sin embargo, nuestros programadores no llegaron a un acuerdo previo entre ellos. Y ahora, además de datos sobre autos reales, ¡podríamos encontrar datos sobre autos de juguete en nuestro XML! Además, tienen los mismos atributos. Digamos que nuestro programa lee un archivo XML de este tipo. ¿Cómo distinguimos un coche real de un coche de juguete?

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">100.00</price>
   </car>
</carstore>
Aquí los prefijos y el espacio de nombres nos ayudarán. Para distinguir los autos de juguete de los reales en nuestro programa (y de hecho cualquier juguete de sus contrapartes reales), introducimos dos prefijos: "real" y "juguete".

<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
¡Ahora nuestro programa podrá distinguir entre las diferentes entidades! Todo lo que tenga el prefijo de juguete será tratado como juguetes :) Sin embargo, aún no hemos terminado. Para usar prefijos, necesitamos registrar cada uno de ellos como un espacio de nombres. En realidad, "registrarse" es una palabra fuerte :) Simplemente necesitamos encontrar un nombre único para cada uno de ellos. Es como con las clases: una clase tiene un nombre corto ( Cat ) y un nombre completo que incluye todos los paquetes ( zoo.animals.Cat). Un URI generalmente se usa para crear un nombre de espacio de nombres único. A veces esto se hace usando una dirección de Internet, donde se describen las funciones de este espacio de nombres. Pero no tiene que ser una dirección de Internet válida. Muy a menudo, los proyectos simplemente usan cadenas similares a URI que ayudan a rastrear la jerarquía del espacio de nombres. Aquí hay un ejemplo:

<?xml version="1.0" encoding="UTF-8"?>
<carstore xmlns:real="http://testproject.developersgroup1.companyname/department2/namespaces/real"
         xmlns:toy="http://testproject.developersgroup1.companyname/department2/namespaces/toy">
<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
</carstore>
Por supuesto, no hay un sitio web en "http://testproject.developersgroup1.companyname/department2/namespaces/real". Pero esta cadena contiene información útil: los desarrolladores del Grupo 1 en el Departamento 2 son responsables de crear el espacio de nombres "real". . Si necesitamos introducir nuevos nombres o discutir posibles conflictos, sabremos a dónde acudir. A veces, los desarrolladores usan una dirección web descriptiva real como un nombre de espacio de nombres único. Por ejemplo, este puede ser el caso de una gran empresa cuyo proyecto será utilizado por millones de personas en todo el mundo. Pero ciertamente esto no siempre se hace: Stack Overflow tiene una discusión sobre este tema. En general, no existe un requisito estricto para usar URI como nombres de espacio de nombres: también puede simplemente usar cadenas aleatorias. Esta opción también funcionaría:

xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
Dicho esto, usar un URI tiene varias ventajas. Puedes leer más sobre esto aquí .

Estándares XML básicos

Los estándares XML son un conjunto de extensiones que agregan funcionalidad adicional a los archivos XML. XML tiene muchos estándares, pero solo veremos los más importantes y descubriremos que hacen posible AJAX, que es uno de los estándares XML más famosos. ¡Te permite cambiar el contenido de una página web sin recargarla! XSLT le permite convertir texto XML a otros formatos. Por ejemplo, puede usar XSLT para convertir XML a HTML. Como hemos dicho, el propósito de XML es describir datos, no mostrarlos. ¡Pero con XSLT podemos sortear esta limitación! XML DOM le permite recuperar, modificar, agregar o eliminar elementos individuales de un archivo XML. Aquí hay un pequeño ejemplo de cómo funciona esto. Tenemos un archivo books.xml:

<bookstore>
   <book category="cooking">
       <title lang="en">Everyday Italian</title>
       <author>Giada De Laurentiis</author>
       <year>2005</year>
       <price>30.00</price>
   </book>
   <book category="children">
       <title lang="en">Harry Potter</title>
       <author>J. K. Rowling</author>
       <year>2005</year>
       <price>29.99</price>
   </book>
</bookstore>
Tiene dos libros. Los libros tienen un elemento <title>. Aquí podemos usar JavaScript para obtener todos los títulos de libros de nuestro archivo XML e imprimir el primero en la consola:

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
  myFunction(this);
  }
};
xhttp.open("GET", "books.xml", true);
xhttp.send();

function myFunction(xml) {
    var xmlDoc = xml.responseXML;
  document.getElementById("demo").innerHTML =
  xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
}
</script>

</body>
</html>
DTD ("definición de tipo de documento") le permite definir una lista de elementos permitidos para una entidad en un archivo XML. Por ejemplo, supongamos que estamos trabajando en el sitio web de una librería y que todos los equipos de desarrollo están de acuerdo en que solo se deben especificar los atributos de título, autor y año para los elementos del libro en los archivos XML. Pero, ¿cómo nos protegemos del descuido? ¡Muy fácil!

<?xml version="1.0"?>
<!DOCTYPE book [
       <!ELEMENT book (title,author,year)>
       <!ELEMENT title (#PCDATA)>
       <!ELEMENT author (#PCDATA)>
       <!ELEMENT year (#PCDATA)>
       ]>

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
</book>
Aquí hemos definido una lista de atributos válidos para <libro>. ¡Intente agregar un nuevo elemento allí e inmediatamente obtendrá un error!

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
   <mainhero>Frodo Baggins</mainhero>
</book>
¡Error! "El elemento mainhero no está permitido aquí" Hay muchos otros estándares XML. Puede familiarizarse con cada uno de ellos e intentar profundizar en el código. De todos modos, si necesitas información sobre XML, puedes encontrar casi todo allí :) Y con esto, nuestra lección llega a su fin. ¡Es hora de volver a las tareas! :) ¡Hasta la proxima vez!
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION