520 likes | 718 Views
XML en JAVA. FUNDAMENTOS BÁSICOS DE XML Y LIBRERÍAS DISPONIBLES PARA TRATARLO EN JAVA. JOSÉ LUIS REDONDO GARCÍA. GRUPO QUERCUS ENGINEERING SOFTWARE, UEX. Contenidos. XML DTD Schema XML Parsing SAX API DOM API XSLT . ¿Qué es XML?. eXtensible Mark-up Language.
E N D
XML en JAVA FUNDAMENTOS BÁSICOS DE XML Y LIBRERÍAS DISPONIBLES PARA TRATARLO EN JAVA JOSÉ LUIS REDONDO GARCÍA. GRUPO QUERCUS ENGINEERING SOFTWARE, UEX
Contenidos • XML • DTD • Schema • XML Parsing • SAX API • DOM API • XSLT
¿Qué es XML? • eXtensible Mark-up Language. • Es un metalenguaje que permite diseñar otros lenguajes (WML, MathML, XHTML,..). • Cualquiera puede desarrollar su propio lenguaje de etiquetas adecuado al tipo de aplicación que más le convenga. • En realidad hay muchas tecnologías basadas en XML (XPath, XLink, XPointer, XSL, ...). • XML 1.0 Specificationhttp://www.w3.org/TR/REC-xml
HTML y XML • SGML (Standard Generalized Markup Language) • HTML es una aplicación de SGML • XML es subconjunto más fácil de usar de SGML • XHTML es una aplicación de XML
XML describe estructura y semántica <?xml version=”1.0”> <!DOCTYPE comedor SYSTEM “comedor.dtd”> <comedor> <fabricante>Ipiña Altzariak</fabricante> <mesa tipo="redonda" madera="arce"> <precio>€400</precio> </mesa> <silla madera="arce"> <cantidad>2</cantidad> <calidad>excelente</calidad> <cojin incluido="sí"> <color>azul</color> </cojin> <precio>€200</precio> </silla> </comedor>
HTML describe formato <html> <head><title>Comedor</title></head> <body> <h1>Comedor</h1> <p>Fabricante: Ipiña Altzariak</p> <ul> <li><b>Mesa redonda de madera de arce</b></li> <li><b>Dos sillas de madera de arce</b>, de excelente calidad, con un cojín azul cada una.</li> <li><b>3 sillas de madera de roble</b>.</li> </ul> </body> </html>
Ventajas XML • Una de las mayores utilidades de XML es poder etiquetar los datos con su significado (self-describing data). • Permite la estructuración de la información. • Ello lleva el tratamiento automático de la información a límites insospechados. • XML es la base de la nueva generación de aplicaciones web intercambio de datos
Usos XML • Sitios web • Permite separar contenido y presentación • Comunicación <-> intercambio datos • Servicios web • Como configuración de programas • Deployment descriptos en servidores J2EE • Ant make system
Componentes documento XML • Los documentos XML constan de: • Instrucciones de procesamiento (processing instructions – PI) • Declaraciones de tipo de documento • Comentarios • Elementos • Referencias a entidades • Secciones CDATA
Instrucciones de procesamiento • Las PI son instruccciones para el procesador del documento XML. • Siempre hay al menos una PI, que pertenece al prólogo del documento: <?xml version="1.0"?> <saludo> Hola, mundo! </saludo>
Comentarios en XML • Los comentarios no se procesan. • Tienen la siguiente sintaxis: <!-- Esto es un comentario -->
Elementos y atributos en XML • Los elementos son los que aportan estructura semántica al documento. • Se delimitan por etiquetas de apertura, cierre y etiquetas sin elementos interiores (etiquetas vacías). • Las etiquetas de apertura y las vacías suelen venir acompañadas de atributos, que parametrizan el elemento. • El valor de los atributos siempre se encierra entre comillas, dobles o simples. <saludo tipo=“coloquial”>Hola</saludo>
Elementos vs. Atributos • Demasiados atributos hacen que los documentos XML se puedan leer difícilmente. • No se puede indicar estructura de documento mediante atributos <CUSTOMER LAST_NAME="Smith“ FIRST_NAME="Sam" DATE="October 15, 2001" PURCHASE="Tomatoes" PRICE=“€1.25" NUMBER="8" />
Elementos vs. Atributos (cont) <CUSTOMER> <NAME> <LAST_NAME>Smith</LAST_NAME> <FIRST_NAME>Sam</FIRST_NAME> </NAME> <DATE>October 15, 2001</DATE> <ORDERS> <ITEM> <PRODUCT>Tomatoes</PRODUCT> <NUMBER>8</NUMBER> <PRICE>$1.25</PRICE> </ITEM> </ORDERS> </CUSTOMER>
Referencias a entidades • Las referencias a entidades sirven para insertar un determinado contenido definido previamente. <!ENTITY Empresa “Universidad de Deusto”> <pie>Creado por &Empresa;</pie>
Códigos de escape • Existen 5 referencias a entidades predefinidas: • & el carácter & • < el carácter < • > el carácter > • ' el carácter ` • " el caracter “ • Se incluyen los caracteres del juego ISO 10646. ‘ ⼱
Secciones CDATA • Las secciones CDATA (character data) contienen texto que no debe ser procesado. • Se tratan como una secuencia de caracteres sin estructura. <![CDATA[<saludo>Hola, mundo!</saludo>]]>
Gramáticas en XML • La gramática que restringe los elementos válidos dentro de un nuevo derivado de XML puede expresarse en forma de: • DTD (Document Type Definitions) o • Esquemas XML
XML Schemas • Los DTD no son muy potentes para definir gramáticas. • Otra forma de hacerlo es con Esquemas XML basados en el propio XML y que soporta más tipos de datos.
Ejemplo Schema • DTD : <!ELEMENT text (#PCDATA | emph | name)*> <!ATTLIST text timestamp NMTOKEN #REQUIRED> • XML Schema: <xsd:element name="text"> <xsd:complexType mixed="true"> <xsd:sequence> <xsd:element ref="emph"/> <xsd:element ref="name"/> </xsd:sequence> <xsd:attribute name="timestamp" type="xsd:date" use="required"/> </xsd:complexType> </xsd:element>
Ejemplo Schema (cont) • XML Document: <?xml version="1.0"?> <text timestamp="08:45:00.000">The deadline of <name>ISO3 assigment</name> is <emph>November 21th 2003</emph>. </text>
XML bien formado y/o XML válido • Hay dos tipos de documentos XML: • Bien formados: son aquellos que cumplen las reglas sintácticas de XML • Válidos: son aquellos que, además de ser bien formados, siguen las reglas de una gramática (definida en un DTD o XML Schema)
Reglas para que un documento esté bien formado • Para que un documento esté bien formado: • Debe tener un prólogo • Debe tener una etiqueta raíz • Las etiquetas se hallan correctamente anidadas • Se usan caracteres válidos y bien aplicados • Los valores de los atributos vienen encerrados entre comillas • ...
Reglas para que un documento sea válido • Para que un documento sea válido debe declarar el DTD o XML Schema contra el cual debe validarse. • Se hace mediante DOCTYPE, pudiendo ser los DTD públicos o de sistema. <!DOCTYPE saludo SYSTEM “saludo.dtd”> <!DOCTYPE saludo PUBLIC “-//Saludos//DTD Lenguaje de saludos//ES” “http://www.deusto.es/dtds/saludo.dtd”> • También se puede insertar el DTD entero en ese punto, en lugar de referenciar al fichero.
Lenguajes basados en XML • Chemical Markup Language (CML) • Mathematical Markup Language (MathML) • Channel Definition Format (CDF) • Synchronized Multimedia Integration Language (SMIL) • XHTML • Scalable Vector Graphics (SVG) • SOAP y WSDL • VoiceML • Wireless Markup Language (WML)
Herramientas de XML • Editores • http://www.xmlcooktop.com/ gratis • XML Spy, www.xmlspy.com • XML parsers • Lee un documento XML • Verifica que XML está bien formado • Verifican que XML es válido • expat, parser written in C by James Clark (www.jclark.com) • Lark, written in Java (www.textuality.com/Lark/) • Apache Jakarta Xerces (www.apache.org) • XML Validators • Verifican que XML es válido • XML.com's Validator based on Lark (xml.com)
¿Por qué usar XML? • Un documento XML puede ser fácilmente procesado y sus datos manipulados • Existen APIs para procesar esos documentos en Java, C, C++, Perl.. (y por supuesto Python) • XML define datos portables al igual que Java define código portable
XML Parsing (cont) • SAX • Define interfaz dirigido por eventos (event-driven) para el procesamiento de un documento XML • Definido por David Megginson y lista correo XML-DEV: http://www.megginson.com/SAX • DOM • Provee una representación de un documento XML en forma de un árbol • Carga todo el documento XML en memoria • http://www.w3.org/DOM
Características de SAX • Analizador o parser SAX: • Detecta cuándo empieza y termina un elemento o el documento, o un conjunto de caracteres, etc. (genera eventos) • Gestiona los espacios de nombres • Comprueba que el documento está bien formado • Las aplicaciones necesitan implementar manejadores de los eventos notificados • SAX lee secuencialmente de principio a fin, sin cargar todo el documento en memoria • Ventaja:eficiencia en cuanto al tiempo y la memoria empleados en el análisis • Desventaja:no disponemos de la estructura en árbol de los documentos
Java JAXP • Define clase SAXParserFactory para crear una instancia de un objeto SAXParser (independiente de implementación SAX parser) factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); • Objeto SAXParser define method parse() para arrancar procesamiento • Es necesario registrar SAXHandlers con cada SAXParser • Los 4 SAX Handlers principales son: • EntityResolver – maneja entidades externas • DTDHandler – maneja eventos de DTD • ContentHandler – maneja contenido de un documento • ErrorHandler – maneja errores
W3C Document Object Model (DOM) • Documentos XML son tratados como un árbol de nodos • Cada elemento es un “nodo” • Los elementos hijos y el texto contenido dentro de un elemento son subnodos • W3C DOM Site: http://www.w3.org/DOM/ • DOM Java Language Binding:http://www.w3.org/TR/DOM-Level-2-Core/java-binding.html
Características DOM • Documento se carga totalmente en memoria en una estructura de árbol • Ventaja:fácil acceder a datos en función de la jerarquía de elementos, así como modificar el contenido de los documentos e incluso crearlos desde cero. • Desventaja:coste en tiempo y memoria que conlleva construir el árbol
W3C XML DOM Objects • Element – un elemento XML • Attribute – un attributo • Text – texto contenido en un elemento o atributo • CDATAsection – sección CDATA • EntityReference – Referencia a una entidad • Entity – Indicación de una entidad XML • ProcessingInstruction – Una instrucción de procesamiento • Comment – Contenido de un comentario de XML • Document – El objeto documento • DocumentType – Referencia al elemento DOCTYPE • DocumentFragment – Referencia a fragmento de documento • Notation – Contenedor de una anotación
Objetos relacionados con Nodos • Node – un nodo en el árbol de un documento • NodeList – una lista de objetos nodos • NamedNodeMap – permite interacción y acceso por nombre a una colección de atributos
Documento XML como un árbol de nodos <?xml version="1.0" encoding="UTF-8"?> <DOCUMENT> <GREETING>Hello from XML</GREETING> <MESSAGE>Welcome to Programing XML in Java</MESSAGE> </DOCUMENT>
Clase DocumentBuilder • Método parse() analiza el fichero entrada • Método Document getDocument() devuelve el documento generado durante parsing parser.parse(fich); Document doc = parser.getDocument();
Métodos del objecto Document • Attr createAttribute(String name)Crea un atributo con el nombre dado • Element createElement(String tagName)Crea un elemento con el nombre dado • Text createTextNode(String data)Crea un nodo de texto • Element getDocumentElement()Devuelve el elemento raíz el documento • Element getElementById(String elementId)Devuelve el elemento identificado por elementId • NodeList getElementsByTagName(String tagname)Devuelve una lista de elementos identificados por el nombre de etiqueta dado
Métodos del interfaz Node • Node • NamedNodeMap getAttributes()Devuelve lista de atributos en un nodo • Node getFirstChild()Devuelve el primer hijo de este nodo • Node getFirstChild()Devuelve el último hijo de este nodo • NodeList getChildNodes()Devuelve todos los hijos de este nodo • Node getParentNode()Devuelve nodo padre del nodo actual • short getNodeType()Devuelve tipo de nodo actual • String getNodeName()Devuelve nombre nodo • String getNodeValue()Devuelve contenido nodo
Métodos del interfaz NodeList y NamedNodeMap • NodeList • int getLength()Devuelve número de nodos en lista • Node item(int index)Devuelve el nodo identificado por index en una colección • NamedNodeMap • int getLength()Devuelve número de nodos en lista • Node getNamedItem(String name)Recupera un nodo dado su nombre • Node item(int index)Devuelve el nodo identificado por index en una colección
Ejemplo DOM I <?xml version="1.0" encoding="iso-8859-1"?> <Peliculas> <Pelicula codigo='1' titulo='Lo que el viento se llevó' director='Victor Fleming' actores='Clark Gable, Vivien Leigh, Leslie Howard'/> <Pelicula codigo='2' titulo='Los Otros' director='Alejandro Amenabar' actores='Nicole Kidman'/> <Pelicula codigo="5" titulo="Malena" director="Giuseppe Tornatore" actores="Monica Bellucci, Giuseppe Sulfaro"/> </Peliculas>
Ejemplo DOM III import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import java.io.IOException; public class EjemploDOM { public static void main(String[] args) { ... DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance(); // Crear nueva instancia de DOMBuilder a través factoria DocumentBuilder parser = fact.newDocumentBuilder(); parser.parse(fich); Document doc = parser.getDocument(); EjemploDOM.tratarNodo(doc); ... } }
Ejemplo DOM IV public static void tratarNodo(Node nodo) { switch (nodo.getNodeType()) { case Node.DOCUMENT_NODE: break; case Node.ELEMENT_NODE: break; case Node.ATTRIBUTE_NODE: break; case Node.TEXT_NODE: break; case Node.CDATA_SECTION_NODE: break; case Node.PROCESSING_INSTRUCTION_NODE: break; case Node.ENTITY_REFERENCE_NODE: break; case Node.DOCUMENT_TYPE_NODE: break; } }
Ejemplo DOM V case Node.DOCUMENT_NODE: System.out.println("<xml version=\"1.0\">"); Document doc = (Document)nodo; tratarNodo(doc.getDocumentElement()); break;