Canigó -Servei de XML 2.2
SERVEI DE XML
IntroduccióPropósitEl Servei XML té 2 propósits principals:
Es tracten de dos característiques diferenciades, però amb el propósit comú d'oferir la possibilitat de tractament de fitxers XML. Context i Escenaris d'ÚsEl Servei XML es troba ubicat dins els Serveis de Presentació de canigo. L'explicació del per què s'ubica en aquesta capa és degut al seu objectiu d'integració amb clients. De la mateixa forma, la manipulació de fitxers XML i serialització/deserialització es considera un tractament necessari per transformar dades d'entrada en objectes de la lógica de negoci i viceversa.
Versions i DependènciesLes dependències descrites a la següent url son requerides per tal de compilar i fer funcionar el projecte: A qui va dirigitAquest document va dirigit als següents perfils:
Documents i Fonts de Referència
Descripció DetalladaArquitectura i ComponentsLa comunitat opensource proposa una desena d'implementacions diferents per a la serialització de XML. Actualment, i a causa del seu grau de facilitat i de performance canigo es basa en la llibreria XStream. A diferència de totes les altres , aquesta llibreria no necessita cap configuració específica. En quant a manipulació dels documents XML, usarem la llibreria dom4j, amb un rendiment millor que jdom i amb més documentació. El servei permet la manipulació de documents XML per mitjà de l'ús de tres interfícies:
Per a més informació sobre les llibreries XML, una comparació de les APIs i un benchmark de les performances, veure la secció 'Documents i Fonts de Referència' Els components podem classificar-los en:
JavaDoc: http://canigo.ctti.gencat.net/confluence/canigodocs/site/canigo2_0/canigo-services-xml/apidocs/index.html Instal- lacióLa instal- lació del servei requereix de la utilització de la llibreria 'canigo-services-xml' i les dependències indicades a l'apartat 'Introducció-Versions i Dependències'. ConfiguracióLa configuració del Servei XML implica 3 pasos:
Definició del servei de serialització Fitxer de configuració: canigo-services-xml.xml Ubicació proposada: <PROJECT_ROOT>/src/main/resources/spring En aquesta configuració es defineix quina implementació específica s'usarà per la serialització. En l'actualitat es permet l'ús de:
Per aquesta implementació podem definir de forma adicional quin serà el mapeig entre les classes i atributs i els tags XML del fitxer. Per a més referència consultar la web de 'XStream'. En l'apartat d'exemples es mostra un cas pràctic de configuració d'aquest fitxer de mapeig. Definició del servei de parseig Fitxer de configuració: canigo-services-xml.xml Ubicació proposada: <PROJECT_ROOT>/src/main/resources/spring En aquesta configuració es defineix quina implementació específica s'usarà per la manipulació de fitxers XML. En l'actualitat es permet l'ús de:
Utilització del ServeiLa utilització del Servei es basa en l´ús de les interfícies definides a l'apartat 'Arquitectura i Components'. Consultar l'apartat 'Exemples' per veure alguns exemples del tractamen de fitxers XML amb l'API proporcionada. A mode de resum podem resumir que:
ExemplesExemple de Serialització basada en XStreamPer a serialitzar un objecte seguirem el següent procediment:
Per defecte, Xstream usa el nom complet de la classe de l'objecte que serialitza. Per exemple, la classe com.mycompany.business.model.Person genera el XML següent:
<?xml version="1.0" encoding="ISO-8859-1"?> <com.mycompany.business.model.person> ... Si volem un nom més fàcil d'ús, podem afegir el mapeig següent: // Mapeig de la classe Person xmlSerializationService.getXMLBindingConfiguration().aliasClass("person", Person.class);
El resultat de la serialització és el document XML següent:
<?xml version="1.0" encoding="ISO-8859-1"?> <person> <firstname>Joe</firstname> <lastname>Walnes</lastname> <phone> <id>123</id> <number>1234-456</number> </phone> <fax> <id>123</id> <number>9999-999</number> </fax> </person>
Exemple de Manipulació de Fitxers XMLPresentarem a través d'exemples concrets les APIs bàsiques de dom4j per realitzar amb poc codi les operacions següents: 1) Parsing XML Per a més informació sobre dom4j, veure la pàgina http://www.dom4j.org/cookbook.html En els exemples següents, "domHelper" referencia el bean del servei XML. Parseig XMLPer a construir un document XML, amb la interfície org.w3c.Document:
String xml = "<?xml version="1.0" encoding="ISO-8859-1"?><person> ...</person>"; org.w3c.Document = domHelper.parse(xml); amb la interfície org.dom4j.Document: String xml = "<?xml version="1.0" encoding="ISO-8859-1"?><person> ...</person>"; SAXReader reader = new SAXReader(new StringReader(xm)); org.dom4j.Document document = reader.read(); Ús d'Iteradors
public void bar(org.dom4j.Document document) throws DocumentException { Element root = document.getRootElement(); // Iteración de los elementos de la rais del Documento for ( Iterator i = root.elementIterator(); i.hasNext(); ) { Element element = (Element) i.next(); ... } // Iteración de los elementos de la raizdel Documento cuyo nombre es "foo" for ( Iterator i = root.elementIterator( "foo" ); i.hasNext(); ) { Element foo = (Element) i.next(); // do something } } Navegació amb XPathPodem avaluar amb XPath expressions per qualsevol element de l'arbre representat al document XML (Attribute, Element):
public void bar(org.dom4j.Document document) { List list = document.selectNodes( "//foo/bar" ); Node node = document.selectSingleNode( "//foo/bar/author" ); String name = node.valueOf( "@name" ); } Per a més informació sobre XPath, veure el tutorial 'http://www.zvon.org/xxl/XPathTutorial/General/examples.html Manipulació de grans documentsEls grans documents no es poden manipular amb iterators perquè aquells necessiten massa memòria. En en el seu lloc usarem mètodes recursius:
org.dom4j.Element root = document.getRootElement(); treeWalk(root); public void treeWalk(org.dom4j.Element element) { for ( int i = 0, size = element.nodeCount(); i < size; i++ ) { Node node = element.node; if ( node instanceof Element ) { treeWalk( (Element) node ); } else { // do something.... } } } Creació de document XML
org.dom4j.Document document = DocumentHelper.createDocument(); Element root = document.addElement( "root" ); Element author1 = root.addElement( "escritor" ) .addAttribute( "name", "Jaume" ) .addAttribute( "location", "Barcelona" ) .addText( "Jaume Primero" ); Escriure en un fitxerAmb la interfície org.w3c.Document:
org.w3c.Document document = ... Amb la interfície org.dom4j.Document: org.dom4j.Document document = ... Conversió del fitxer XML en un String
org.dom4j.Document document = ...;
String text = document.asXML();
Realitzar transformacions XSLT
// Get the XML source and XSLT DOMSource xml = new DOMSource(new File("afile.xml")); DOMSource xslt = new DOMSource(new File("astyle.xslt")); DOMResult result = domHelper.transform(xml, xslt); |