La construcción de código personalizado con el API de Java para XML Binding (JAXB)

Usted puede construir código personalizado con JAXB

- el API Java para XML Binding. Con JAXB, usted toma un documento XML y haces un archivo de clase Java que es perfecto para procesar el documento. Cuando sus necesidades cambian y la clase ya no hace lo que quieres que haga, que acaba de generar una nueva subclase.

Cuando se escribe SAX o código DOM, se crea un programa de procesamiento de XML. Su programa lee un documento, y utiliza el documento para hacer un trabajo útil - comenzando con algo inofensivo como public void startElement o node.getNodeName (). De cualquier manera, el programa no hace suposiciones acerca de lo que hay dentro del documento. El documento tiene un raíz elemento, algunos elementos secundarios, y eso es todo. Cualquier hipótesis especiales que realice sobre este documento realidad estrechan la utilidad del código.

Código Versátil contra código personalizado

Considere el código en los listados 1 y 2. Listado 1, analiza cinco nodos en un árbol de documentos. Esos cinco nodos tienen que estar dispuestos de manera cierta, o de lo contrario el programa se bloquea. (La lista quiere un comentario y un nodo raíz, con al menos dos hijos directamente bajo el nodo raíz.)

Ficha 1: Viendo a pocos nodos

importación org.w3c.dom.Node-
importación org.w3c.dom.NamedNodeMap-
clase MyTreeTraverser
{
MyTreeTraverser (nodo Node)
{
System.out.println (node.getNodeName ()) -
nodo = node.getFirstChild () -
System.out.println (node.getNodeName ()) -
nodo = node.getNextSibling () -
System.out.println (node.getNodeName ()) -
nodo = node.getFirstChild () -
System.out.println (node.getNodeName ()) -
nodo = node.getNextSibling () -
System.out.println (node.getNodeName ()) -
}
}

Ficha 2: Recorriendo el árbol DOM

importación org.w3c.dom.Node-
importación org.w3c.dom.NamedNodeMap-
clase MyTreeTraverser
{
Node- Nodo
MyTreeTraverser (nodo Node)
{
this.node = node-
mostrar nombre()-
DisplayValue () -
si (node.getNodeType () == Node.ELEMENT_NODE)
displayAttributes () -
System.out.println () -
displayChildren () -
}
anular idioma ()
{
System.out.print ("Nombre:") -
System.out.println (node.getNodeName ()) -
}
anular DisplayValue ()
{
Cadena nodeValue = node.getNodeValue () -
if (! nodeValue = null)
nodeValue = nodeValue.trim () -
System.out.print ("Valor") -
System.out.println (nodeValue) -
}
displayAttributes void ()
{
NamedNodeMap attribs = node.getAttributes () -
for (int i = 0- i lt; attribs.getLength () - i ++)
{
System.out.println () -
System.out.print ("Atributo:") -
System.out.print (attribs.item (i) .getNodeName ()) -
System.out.print ("=") -
System.out.println (attribs.item (i) .getNodeValue ()) -
}
}
displayChildren void ()
{
Nodo hijo = node.getFirstChild () -
while (niño! = null)
{
nueva MyTreeTraverser (infantil) -
niño = child.getNextSibling () -
}
}
}

El código del Listado 2 es mucho más general. Este código comprueba la estructura del documento ya que se ejecuta. Cuando el código encuentra un nodo hijo, escanea el niño y busca nietos. Si no hay nietos, el código busca hermanos y hermanas. El código puede manejar cualquier árbol del documento - si tiene un nodo o un millar de nodos.

Por lo tanto, el Listado 2 es más versátil que el Listado 1. Sin embargo, esta versatilidad viene con inconvenientes - incluyendo la posibilidad de muy alto por encima. El código del Listado 2 tiene que analizar todo el documento XML - y luego poner una representación de árbol del documento en la memoria del ordenador. Si el documento es muy grande, entonces la representación es grande: la memoria se hinchado con todo lo que los datos temporales, y el código en el Listado 2 se desacelera a paso de tortuga.

Los beneficios de la personalización

Imagínese que usted está tratando de conducir a Faneuil Hall en Boston, Massachusetts. No importa donde usted comienza de- el viaje siempre será confuso y difícil. De todos modos, hay que planificar la ruta. Puede perderse en alrededores Revere o Cambridge o en el centro de Boston. En función de sus recursos, tiene dos opciones:

  • Usted puede parar en una gasolinera y comprar un mapa. Si lo hace, entonces es posible que nunca llegan a Faneuil Hall. Después de todo, usted tiene que encontrar dónde está en el mapa, buscar rutas alternativas, elegir una ruta, y luego (el cielo te ayudan a) tratar de seguir la ruta sin perderse de nuevo.
  • Usted puede decirle a su hablar sistema caro, GPS que desea llegar a Faneuil Hall. El sistema trazará una ruta personalizada y le guiará, giro a giro, desde cualquier lugar miserable que está en la ruta óptima que conduce desde allí a Faneuil Hall. La ruta es tan personalizado que la voz del GPS dice (por ejemplo), "No hay señales en esta intersección, gire a la izquierda, pero de todos modos." Más tarde, la voz dice: "Hay dos señales en esta intersección, y las señales se contradicen entre sí. Pero gire a la derecha de todos modos."

Utilizando el mapa de papel necesita más trabajo (más tiempo, esfuerzo, destreza y paciencia) de utilizar el GPS hablar. ¿Por qué? Debido a que el mapa de papel no se adapta a su necesidades- específico en efecto, dice: "Aquí está toda el área metropolitana de Boston. Faneuil Hall se encuentra en alguna parte. usted averiguar qué hacer a continuación ".

Un sistema personalizado es (como era de esperar) más fácil de usar que uno que no se adapta a su situación inmediata. Por lo tanto, el código de procesamiento XML del Listado 2 hace un enorme árbol DOM-tragando recursos en el espacio de memoria de su ordenador ("Aquí está el árbol - averiguar qué hacer a continuación. . .. ") Debido a que el código no está personalizada El código funciona para cualquier documento de edad - no sólo el que usted tiene en la mano - y siempre engulle recursos para hacerlo.

La esencia de JAXB

La idea detrás de JAXB es crear clases personalizadas a la medida para satisfacer sus necesidades actuales. Usted toma la descripción de un documento XML, ejecuta a través de un programa especial llamado compilador de esquema, y obtener una nueva clase llamada clase generada. Esta clase generada se hace más eficiente para trabajar con determinados documentos XML.

Por ejemplo, si sus documentos XML tienen elementos nombrados total, entonces la clase generada puede tener métodos setTotal y getTotal. Si el elemento de un documento tiene un atributo fullName, entonces la clase generada puede tener métodos setFullName y getFullName. (Ver Figura 1.)

La conexión entre una parte de un documento XML y una parte de una clase Java se llama Unión. Con todos estos enlaces, una instancia de la clase representa un único documento XML.

La construcción de código personalizado con el API de Java para XML Binding (JAXB)

Figura 1: Un objeto representa un documento.

Entonces, ¿cómo se conecta un objeto con un documento XML? Bueno, la clase generada tiene métodos nombrados unmarshal y mariscal. (Ver Figura 2.)

  • El método unmarshal lee un archivo XML. El método obtiene los valores del documento XML, y asigna estos valores a las variables del objeto Java.
  • El método mariscal escribe un archivo XML. El método obtiene valores del objeto Java, y utiliza estos valores para crear el documento XML.

Con métodos como estos, puede recuperar y modificar los datos de un documento XML.

La construcción de código personalizado con el API de Java para XML Binding (JAXB)

Figura 2: Los valores de lectura y escritura.



» » » » La construcción de código personalizado con el API de Java para XML Binding (JAXB)