JavaRush /Blog Java /Random-ES /XML en Java: ¿Qué es?

XML en Java: ¿Qué es?

Publicado en el grupo Random-ES
¡Hola! Hoy nos familiarizaremos con otro formato de datos llamado XML. Este es un tema muy importante. Cuando trabaje en aplicaciones Java reales, es casi seguro que encontrará problemas relacionados con XML. Este formato se utiliza en casi todas partes en el desarrollo de Java (aprenderemos exactamente por qué a continuación), por lo que le recomiendo que lea la conferencia no "en diagonal", sino que comprenda todo a fondo y al mismo tiempo estudie literatura/enlaces adicionales :) Este Definitivamente no se perderá el tiempo. Entonces, comencemos con los más simples: ¡“qué” y “por qué”!

¿Qué es XML?

XML significa lenguaje de marcado extensible. Quizás ya estés familiarizado con uno de los lenguajes de marcado: has oído hablar de HTML, que se utiliza para crear páginas web :) ¿Qué es XML? - 1HTML y XML son incluso similares en apariencia:
HTML1
<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML 1
<headline>title</headline>
<paragraph>paragraph</paragraph>
<paragraph>paragraph</paragraph>
HTML2
<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
xml 2
<chief>title</chief>
<paragraph>paragraph</paragraph>
<paragraph>paragraph</paragraph>
En otras palabras, XML es un lenguaje para describir datos.

¿Por qué se necesita XML?

XML se inventó originalmente para un almacenamiento y transmisión de datos más conveniente, incluso a través de Internet. Tiene una serie de ventajas que le permiten afrontar con éxito esta tarea. Primero, es fácil de leer tanto para humanos como para computadoras. 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>
La computadora también entiende fácilmente este formato. En segundo lugar, dado que los datos se almacenan en un formato de texto simple, no habrá problemas de compatibilidad al transferirlos de una computadora a otra. Es importante entender que XML no es un código ejecutable, sino un lenguaje de descripción de datos . Después de haber descrito los datos usando XML, necesita escribir código (por ejemplo, en Java) que pueda enviar/recibir/procesar estos datos.

¿Cómo funciona XML?

Su componente principal son las etiquetas: estas son las cosas entre paréntesis angulares:
<book>
</book>
Hay etiquetas de apertura y cierre. El de cierre tiene un símbolo adicional: " /", esto se puede ver en el ejemplo anterior. Cada etiqueta de apertura debe tener una etiqueta de cierre correspondiente. 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 <book> tiene 3 subetiquetas: <title> , <author> y <year> . Esto no se limita a un nivel: las subetiquetas pueden tener sus propias subetiquetas, etc. Este diseño se llama árbol de etiquetas. Veamos el árbol usando el ejemplo de un archivo XML con una descripción de 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 "raíz" - etiqueta raíz. <carstore> tiene una etiqueta secundaria, <car>. <car>, a su vez, también tiene 3 etiquetas secundarias propias: <modelo>, <año> y <precio>. Cada etiqueta puede tener atributos: información adicional importante. En nuestro ejemplo, la etiqueta <modelo> tiene el atributo "lang", el idioma en el que está escrito el nombre del modelo:
<model lang="en">Scania R 770</model>
De esta forma podemos indicar que el título está escrito en inglés. Nuestra etiqueta <precio> tiene un atributo de "moneda".
<price currency="US dollar">150000.00</price>
De esta forma podemos indicar que el precio del auto está en dólares estadounidenses. Por tanto, XML tiene una sintaxis "autodescriptiva" . Puede agregar cualquier información que necesite para describir los datos. También puedes agregar una línea al principio del archivo indicando la versión XML y la codificación en la que están escritos los datos. Se llama " prólogo " y tiene este aspecto:
<?xml version="1.0" encoding="UTF-8"?>
Utilizamos XML versión 1.0 y codificación UTF-8. Esto no es necesario, pero puede resultar útil si, por ejemplo, utilizas texto en diferentes idiomas en tu archivo. Mencionamos que XML significa "lenguaje de marcado extensible", pero ¿qué significa "extensible"? Esto significa que es perfectamente adecuado para crear nuevas versiones de sus objetos y archivos. Por ejemplo, ¡queremos que nuestra sala de exposición de automóviles empiece a vender motocicletas también! Al mismo tiempo, en el programa necesitamos admitir ambas versiones de <carstore>: tanto la antigua (sin motocicletas) como 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 y 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 sencillo agregamos la descripción de las motocicletas a nuestro archivo :) Al mismo tiempo, no necesitamos en absoluto establecer 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>: el propietario. Esto no impedirá que una computadora (ni una persona tampoco) lea los datos.

Diferencias entre XML y HTML

Ya hemos dicho que XML y HTML son muy similares en apariencia. Por eso, es muy importante saber en qué se diferencian. En primer lugar, se utilizan para diferentes propósitos. HTML: para marcar páginas web. Por ejemplo, si necesita crear un sitio web, usando HTML puede especificar: “El menú debe estar en la esquina superior derecha. Debería tener tales y tales botones”. En otras palabras, el propósito del HTML es mostrar datos. XML: para almacenar y transmitir información en una forma conveniente para humanos y computadoras. Este formato no contiene instrucciones sobre cómo se deben mostrar estos datos: depende del código del propio programa. En segundo lugar, tienen una diferencia técnica principal. Las etiquetas HTML están predefinidas. En otras palabras, para crear un título (por ejemplo, una inscripción grande al principio de la página), en HTML solo se utilizan etiquetas <h1></h1> (para títulos más pequeños, <h2></h2>, < h3></h3>). No podrás crear encabezados en HTML usando etiquetas con títulos diferentes. XML no utiliza etiquetas predefinidas. Puede darle a las etiquetas los nombres que desee: <encabezado>, <título>, <idontknow2121>.

La resolución de conflictos

La libertad que proporciona XML también puede generar algunos problemas. Por ejemplo, un programa puede utilizar la misma entidad (por ejemplo, una máquina) para diferentes propósitos. Por ejemplo, tenemos un archivo XML que describe máquinas. Sin embargo, nuestros programadores no se pusieron de acuerdo de antemano entre ellos. ¡Y ahora, además de datos de autos reales, nuestro xml también incluye datos de modelos de juguetes! Además, tienen los mismos atributos. Nuestro programa recibe el siguiente archivo XML. ¿Cómo podemos distinguir un coche real de un modelo 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>
Los prefijos y espacios de nombres nos ayudarán aquí. Para separar los coches de juguete de los reales en nuestro programa (y, en general, cualquier juguete de sus prototipos 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 entidades! Todo lo que tenga el prefijo juguete se clasificará como juguete :) Sin embargo, aún no hemos terminado. Para usar prefijos, debemos registrar cada uno de ellos como un espacio de nombres. Bueno, en realidad "registrarse" es una palabra fuerte :) Sólo necesitas 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 con todos los paquetes ( zoo.animals.Cat) Para crear espacios de nombres únicos se suele utilizar una URI . En ocasiones se sustituye aquí la dirección de Internet, donde se describen en detalle las funciones y el propósito de este espacio de nombres. Pero no es necesario que sea una dirección de Internet válida. Muy a menudo, los proyectos simplemente utilizan cadenas similares a URI que ayudan a rastrear la jerarquía de los espacios de nombres. He aquí 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 ningún sitio en Internet con la dirección http://testproject.developersgroup1.companyname/department2/namespaces/real. Pero hay información útil: el grupo de desarrolladores "developersgroup1" del departamento "department2" es responsable de crear el espacio de nombres "real". Si necesita agregar nuevos nombres o discutir posibles conflictos con ellos, sabemos a quién acudir. A veces, se utiliza una dirección de Internet real con una descripción de este espacio de nombres como nombre único para un espacio de nombres. Por ejemplo, si se trata de una gran empresa y su proyecto será utilizado por millones de personas en todo el mundo. Pero esto no siempre se hace: hay una discusión sobre este tema en Stackoverflow . En principio, el requisito de utilizar URI como nombres para espacios de nombres no es estricto: simplemente puede utilizar cadenas aleatorias. Esta opción también funcionará:
xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
Pero el uso de URI tiene una serie de 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 qué permiten que haga AJAX , uno de los estándares XML más famosos. ¡Te permite cambiar el contenido de una página web sin recargarla! ¿Suena bien? :) Puedes probar esta tecnología en persona aquí . XSLT : le permite convertir texto XML a otros formatos. Por ejemplo, usando XSLT, puedes transformar XML en HTML. El propósito de XML, como ya hemos dicho, es describir datos, no mostrarlos. ¡Pero usando XSLT podemos evitar esta limitación! Aquí hay un entorno limitado con un ejemplo funcional, donde puede ver usted mismo cómo funciona :) XML DOM : le permite obtener, cambiar, agregar o eliminar elementos individuales de un archivo XML. Aquí tienes un pequeño ejemplo de cómo funciona. 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>
Hay dos libros en él. Los libros tienen un elemento como el título: <título>. Y aquí podemos usar JavaScript para obtener todos los títulos de libros de nuestro archivo XML y enviar el primero de ellos a 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>
Nuevamente, recomiendo ver cómo funciona este ejemplo usando una zona de pruebas :) DTD (“definición de tipo de documento”): le permite definir una lista de elementos permitidos para alguna entidad en un archivo XML. Por ejemplo, estamos trabajando en el sitio web de una librería y todos los equipos de desarrollo acordaron que para el elemento libro, solo se deben especificar los atributos de título, autor y año en los archivos XML. Pero ¿cómo podemos protegernos de la falta de atención? ¡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í" Existen muchos otros estándares XML. Puede familiarizarse con cada uno de ellos e intentar profundizar en el código en el sitio web de WC3 (sección "Estándares XML importantes"). Y en general, si necesitas información sobre XML, allí puedes encontrar casi todo :) Bueno, nuestra conferencia ha llegado a su fin. ¡Es hora de volver a las tareas! :) ¡Nos vemos!
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION