prucommercialre.com


Edificio Código de encargo con el API de Java para XML Binding (JAXB)

Usted puede construir código personalizado con JAXB - la 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 escribes SAX o DOM código, se crea un programa de procesamiento de XML. Su programa lee un documento, y utiliza el documento para realizar trabajo útil - comenzando con algo inofensivo como public void startElement o node.getNodeName (). De cualquier manera, el programa no hace suposiciones sobre lo que hay dentro del documento. El documento tiene un elemento raíz, algunos elementos secundarios, y eso es todo. Cualquier hipótesis especiales que tome sobre este documento en realidad se estrechan la utilidad del código.

Código Versátil frente 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 dispuestas de cierta manera, 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

org.w3c.dom.Node importación;
org.w3c.dom.NamedNodeMap importación;
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

org.w3c.dom.Node importación;
org.w3c.dom.NamedNodeMap importación;
clase MyTreeTraverser
{
Nodo Nodo;
MyTreeTraverser (nodo Node)
{
this.node = nodo;
nombre para mostrar ();
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 <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 ();
mientras que (el niño! = null)
{
nueva MyTreeTraverser (niño);
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 corre. Cuando el código encuentra un nodo hijo, que escanea el niño y mira a los nietos. Si no hay nietos, el código es para los 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 el documento XML completo - 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 de Boston, Massachusetts. No importa donde usted sale; el viaje siempre será confuso y difícil. De todos modos, hay que planificar su 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 usted puede nunca llegar 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 estás 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 signos en esta intersección, y las señales se contradicen entre sí. Pero girar 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 sus necesidades específicas; en efecto, que 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) 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 una enorme, árbol DOM-tragando recursos en el espacio de memoria de su ordenador ("Aquí está el árbol - a averiguar qué hacer a continuación...") Debido a que el código no está personalizado. 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 un compilador de esquema, y obtener una clase nueva denominada clase generada. Esta clase generada se hace más eficiente para trabajar con determinados documentos XML.

Por ejemplo, si los 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 denomina unión. Con todos estos enlaces, una instancia de la clase representa un único documento XML.

Edificio Código de encargo 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 llamados 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 los 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.

Edificio Código de encargo con el API de Java para XML Binding (JAXB)

Figura 2: Valores de escritura y lectura.