Articulo de referencia

API de Java para el procesamiento de XML

En informática , la API de Java para el procesamiento de XML ( JAXP ) ( / ˈ dʒ æ k s p iː / JAKS -pee ), una de las interfaces de programación de aplicaciones (API) de Java XML ...

En informática , la API de Java para el procesamiento de XML ( JAXP ) ( / ˈ æ k s p / JAKS -pee ), una de las interfaces de programación de aplicaciones (API) de Java XML , proporciona la capacidad de validar y analizar documentos XML . Tiene tres interfaces de análisis básicas:

Además de las interfaces de análisis sintáctico, la API proporciona una interfaz XSLT para realizar transformaciones de datos y estructurales en un documento XML.

JAXP se desarrolló bajo el Proceso de la Comunidad Java como JSR 5 (JAXP 1.0), JSR 63 (JAXP 1.1 y 1.2) y JSR 206 (JAXP 1.3).

La versión 1.4.4 de JAXP se lanzó el 3 de septiembre de 2010. La versión 1.3 de JAXP se declaró obsoleta el 12 de febrero de 2008.

Interfaz DOM

La interfaz DOM analiza un documento XML completo y construye una representación completa en memoria del documento utilizando las clases y modelando los conceptos que se encuentran en la Especificación básica de nivel 2 del Modelo de objetos de documento (DOM).

El analizador DOM se llama , ya que construye una representación en memoria . El es creado por el . [ 2 ] El crea una instancia, una estructura de árbol que contiene nodos en el documento XML. Cada nodo de árbol en la estructura implementa la interfaz. Entre los muchos tipos diferentes de nodos de árbol, cada uno de los cuales representa el tipo de datos que se encuentran en un documento XML, los más importantes incluyen:DocumentBuilderDocumentjavax.xml.parsers.DocumentBuilderjavax.xml.parsers.DocumentBuilderFactoryDocumentBuilderorg.w3c.dom.Documentorg.w3c.dom.Node

  • nodos de elementos que pueden tener atributos
  • Nodos de texto que representan el texto que se encuentra entre las etiquetas de inicio y fin de un elemento del documento.

Interfaz SAX

El javax.xml.parsers.SAXParserFactoryanalizador crea el analizador SAX, llamado SAXParser. A diferencia del analizador DOM, el analizador SAX no crea una representación en memoria del documento XML y, por lo tanto, se ejecuta más rápido y usa menos memoria. En cambio, el analizador SAX informa a los clientes de la estructura del documento XML invocando funciones de devolución de llamada, es decir, invocando métodos en una DefaultHandlerinstancia proporcionada al analizador. Esta forma de acceder al documento se llama Streaming XML .

La DefaultHandlerclase implementa las interfaces ContentHandler, ErrorHandler, DTDHandler, y EntityResolver. La mayoría de los clientes estarán interesados ​​en los métodos definidos en la ContentHandlerinterfaz que se llaman cuando el analizador SAX encuentra los elementos correspondientes en el documento XML. Los métodos más importantes en esta interfaz son:

  • startDocument()y endDocument()métodos que se llaman al principio y al final de un documento XML.
  • startElement()y endElement()métodos que se llaman al principio y al final de un elemento del documento.
  • characters()Método que se llama con el contenido de datos de texto que se encuentra entre las etiquetas de inicio y fin de un elemento de documento XML.

Los clientes proporcionan una subclase DefaultHandlerque sobrescribe estos métodos y procesa los datos. Esto puede implicar almacenar los datos en una base de datos o escribirlos en un flujo de datos.

Durante el análisis, el analizador puede necesitar acceder a documentos externos. Es posible almacenar una caché local para los documentos de uso frecuente mediante un catálogo XML .

Esto se introdujo con Java 1.3 en mayo de 2000. [ 3 ]

Interfaz StAX

StAX se diseñó como un punto intermedio entre las interfaces DOM y SAX. En su metáfora, el punto de entrada programático es un cursor que representa una posición dentro del documento. La aplicación mueve el cursor hacia adelante, extrayendo la información del analizador según la necesite. Esto difiere de una API basada en eventos, como SAX, que envía datos a la aplicación, lo que requiere que esta mantenga un estado entre eventos para rastrear la ubicación dentro del documento.

Interfaz XSLT

El lenguaje de hojas de estilo XML para transformaciones , o XSLT , permite convertir un documento XML en otros formatos de datos. JAXP proporciona interfaces que permiten a las aplicaciones invocar una transformación XSLT. Esta interfaz se denominó originalmente TrAX (API de transformación para XML) y fue desarrollada mediante una colaboración informal entre los desarrolladores de varios procesadores XSLT de Java.javax.xml.transform

Las principales características de la interfaz son:

  • una clase de fábrica que permite a la aplicación seleccionar dinámicamente qué procesador XSLT desea utilizar ( TransformerFactory, TransformerFactory.newInstance(), TransformerFactory.newInstance(String factoryClassName, ClassLoader classLoader).
  • métodos en la clase de fábrica para crear un Templatesobjeto, que representa la forma compilada de una hoja de estilo. Este es un objeto seguro para subprocesos que se puede usar repetidamente, en serie o en paralelo, para aplicar la misma hoja de estilo a varios documentos fuente (o al mismo documento fuente con diferentes parámetros) ( TransformerFactory.newTemplates(Source source)), también TransformerFactory.newTransformer(Source source), TransformerFactory.newTransformer()), un método en el objeto para crear un , que representa la forma ejecutable de una hoja de estilo ( ) Esto no se puede compartir entre subprocesos, aunque es reutilizable en serie. Proporciona métodos para establecer parámetros de hoja de estilo y opciones de serialización (por ejemplo, si la salida debe estar indentada) y un método para ejecutar la transformación. ( ).Templatesjavax.xml.transform.TransformerTemplates.newTransformer()TransformerTransformerFactory.transformer(Source xmlSource, Result outputTarget)

SourceSe definen dos interfaces abstractas Resultpara representar la entrada y la salida de la transformación. Este es un uso algo inusual de las interfaces de Java, ya que no se espera que un procesador acepte cualquier clase que implemente la interfaz; cada procesador puede elegir qué tipos de o está preparado para manejar. En la práctica, todos los procesadores JAXP admiten varios tipos estándar de Source ( , ) y varios tipos estándar de Result ( , ) y posiblemente otras implementaciones propias.SourceResultDOMSourceSAXSourceStreamSourceDOMResultSAXResultStreamResult

Ejemplo

El ejemplo más primitivo pero completo de lanzamiento de una transformación XSLT podría verse así:

/* archivo src/examples/xslt/XsltDemo.java */ paquete examples.xslt ;import java.io.StringReader ; import java.io.StringWriter ;import javax.xml.transform.Transformer ; import javax.xml.transform.TransformerException ; import javax.xml.transform.TransformerFactory ; import javax.xml.transform.TransformerFactoryConfigurationError ; import javax.xml.transform.stream.StreamResult ; import javax.xml.transform.stream.StreamSource ;public class XsltDemo { public static void main ( String [] args ) throws TransformerFactoryConfigurationError , TransformerException { //language=xslt String xsltResource = """  <?xml version='1.0' encoding='UTF-8'?>  <xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>  <xsl:output method='xml' indent='no'/>  <xsl:template match='/'>  <reRoot><reNode><xsl:value-of select='/root/node/@val' /> world</reNode></reRoot>  </xsl:template>  </xsl:stylesheet>  """ ; // language=XML String xmlSourceResource = """  <?xml version='1.0' encoding='UTF-8'?>  <root><node val='hello'/></root>  """ ;StringWriter xmlResultResource = new StringWriter ();Transformer xmlTransformer = TransformerFactory.newInstance (). newTransformer ( new StreamSource ( new StringReader ( xsltResource ) ) ) ;xmlTransformer.transform ( new StreamSource ( new StringReader ( xmlSourceResource )) , new StreamResult ( xmlResultResource ) ) ;System.out.println ( xmlResultResource.getBuffer ( ) . toString ( ) ) ; } }

Aplica la siguiente transformación XSLT codificada:

<?xml version='1.0' encoding='UTF-8'?> <xsl:stylesheet version= '2.0' xmlns:xsl= 'http://www.w3.org/1999/XSL/Transform' > <xsl:output method= 'xml' indent= 'no' /> <xsl:template match= '/' > <reRoot><reNode><xsl:value-of select= '/root/node/@val' /> mundo </reNode></reRoot> </xsl:template> </xsl:stylesheet>

Al siguiente documento XML codificado:

<?xml version='1.0' encoding='UTF-8'?> <root><node val= 'hello' /></root>

El resultado de la ejecución será

<?xml version="1.0" encoding="UTF-8"?> <reRoot><reNode> hola mundo </reNode></reRoot>

Citas

  1. "El programa Java Community Process(SM) - JSRS: Java Specification Requests - detalle JSR# 206" .
  2. Horstmann 2022 , §3.3 Análisis de un documento XML.
  3. Compare el índice de la API de Java 1.2.1 con el índice de la versión 1.3 . La solicitud de especificación de Java (JSR) 5, especificación de análisis XML , se finalizó el 21 de marzo de 2000 .

Referencias

  • Horstmann, Cay (15 de abril de 2022). Java central . Prensa Oracle Java. ISBN 978-0-13-787107-0.
  • Página principal del proyecto de implementación de referencia de JAXP (archivada el 12 de agosto de 2011 en Wayback Machine) .