Examples of how to validate a XML document with local DTD or XSD Schema in Java
ejemplo de como validar un docpumento xml contra un dtd o un xsd esquema local en Java
1. MAURO GOMEZ MEJIA
IX SEMESTRE INGENIERIA DE SISTEMAS
Ingenio DS
Programando Soluciones
http://ingeniods.wordpres.com
2. DOM nace del W3C, desde el
principio de los navegadores cada
cual hacia lo que quería, como lo
quería (aun sucede) así que a los
diseñadores les figuraba, escribir
pagina para navegadores, o dicho de
otra forma una para Netscape, una DOM nace para estandarizar la forma
para IE… en que se relacionan navegador-
documento-elemento.
En primera instancia fue diseñado para
HTML - JavaScript; y es DOM el que
permite hacer esto:
document.div[0]
Ingenio DS
Programando Soluciones
http://ingeniods.wordpres.com
3. JDOM, teniendo en cuenta las
complicaciones y falencias que tienen JDOM no es un Wrapper Java
SAX y DOM. Vienen dos pelaos (Jason de DOM y tampoco es un
Hunter y Brett McLaughlin) y desarrollan parser, el una librería que
JDOM, aunque habían muchas permite manipular documentos
aplicaciones que necesitaban un formato XML en Java, se basa en dos
especifico: DOM Tree o SAX Event así librerías la DOM y la SAX
que JDOM da soporte para estos. (estas si son parsers XML).
JDOM utiliza los parsers:
• Crimson.
• DOM.
• JAXP.
• Xerces. JDOM utiliza internamente las
• XML4J. estructuras de datos:
• List.
• Map.
Ingenio DS
Programando Soluciones
http://ingeniods.wordpres.com
4. Para cargar documentos
existen varios métodos los • build (java.io.File file).
que prefiero usar son: • build (java.io.Reader characterStream).
De la clase SAXBuilder
build (java.io.File file): recibe
como parámetro un File que
supone es el documento XML File file_xml=new File(“midoc.xml”);
SAXBuilder builder = new SAXBuilder();
Document doc= builder.build(file_xml);
build (java.io.Reader characterStream):
recibe como parámetro un Reader que
es una source de caracteres o dicho de
otra manera un String se supone es
representativo de un documento XML
String str_xml=“<?xml version="1.0" encoding="UTF-8" ?>”;
SAXBuilder builder = new SAXBuilder();
Document doc= builder.build(new StringReader(str_xml));
Ingenio DS
Programando Soluciones
http://ingeniods.wordpres.com
5. Para crear documentos es tan fácil e intuitivo como
debería serlo témenos dos clases Document, y
Element
Y hasta ahora nada nuevo tenemos que un documento solo debe
tener un elemento raíz.
Tanto al documento como a los
elementos podemos agregarles
contenido, este contenido puede ser
texto u otro elemento.
Document docXML = new Document();
Element root = new Element("root");
root.addContent(new Element("child"));
docXML.addContent(root);
Ingenio DS
Programando Soluciones
http://ingeniods.wordpres.com
6. Para sacar el Document del aplicativo al mundo
tenemos que pasarlo a un fichero (obvio) y esto
sucede usando la clase XMLOutputter y la case
Format
La clase XMLOutputter se encarga de convertir el Document a
String.
La clase Format de especificar el
formato en como generará este String,
dicho de otra forma espacios saltos de
línea y esas cosas .
/* contamos con que docXML es de tipo
Document y ya ha sido inicializado*/
Format format = Format.getPrettyFormat();
XMLOutputter xmloutputter = new XMLOutputter(format);
String stringXML = xmloutputter.outputString(docXML);
Ya con este String podemos hacer lo que
queramos ej.: Enviarlo a un fichero o a una BD o a Ingenio DS
las preferencias, etc… Programando Soluciones
http://ingeniods.wordpres.com
7. Para validar el documento XML contra un DTD se usa la
clase DocType, así mismo como el elemento doctype esta
sirve para lo mismo ahora como sucede la validación
En el caso planteado.
DocType docType = new DocType(„‟root„‟,‟‟midtd.dtd‟‟);
/* contamos con que docXML es de tipo
Document y ya ha sido inicializado*/
DocType docType = new DocType(„‟root„‟,‟‟midtd.dtd‟‟);
docXML.setDocType(docType);
String str_xml=/*convertimos a string docXML*/;
SAXBuilder builder=new SAXBuilder(true);
/*reconstruimos y realiza la validación automativa*/
docXML=builder.build(new StringReader(convertirXML(str_xml)));
En caso de no ser valido lanzara una
JDOException
Ingenio DS
Programando Soluciones
http://ingeniods.wordpres.com
8. Para validar el documento XML contra un XSD se setea un
atributo de la misma SAXBuilder
En el caso planteado. Con XSD local
SAXBuilder builder=new SAXBuilder(true);
String propiedad= "http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation";
builder.setProperty (propiedad, " mixsd.xsd");
El resto es igual al caso anterior
/* contamos con que docXML es de tipo
Document y ya ha sido inicializado*/
String str_xml=/*convertimos a string docXML*/;
/*reconstruimos y realiza la validación automativa*/
docXML=builder.build(new StringReader(convertirXML(str_xm)));
En caso de no ser valido lanzara una Esta manera puede
JDOException no siempre funcionar
Ingenio DS
Programando Soluciones
http://ingeniods.wordpres.com
9. Para validar el documento XML contra un XSD podemos
crear una instancia de un javax.xml.validation.Schema
En el caso planteado. Con XSD local
String nonames=XMLConstants.W3C_XML_SCHEMA_NS_URI;
SchemaFactory schemaFactory = SchemaFactory.newInstance(nonames);
Schema schema = schemaFactory.newSchema(new File(xsd_dir));
Con XMLConstants.W3C_XML_SCHEMA_NS_URI decimos
usaremos un Schema local
SchemaFactory.newInstance(nonames);//creamos nuestra «caja» de Schemas
schemaFactory.newSchema(new File(xsd_dir)); //obtenemos
nuestro Schema de la «caja»
Validator validator = schema.newValidator();
validator.validate(new StreamSource(new File(“midocumento.xml")));
schema.newValidator();//del Schema obtenemos un validador
validator.validate(new StreamSource(new File(“midocumento.xml"))); //Validamos
En caso de no ser valido lanzara una
JDOException Ingenio DS
Programando Soluciones
http://ingeniods.wordpres.com
10. Para buscar elementos o contenidos con JDOM pues
tocaría buscarlos elementos a elemento
JDOM presta soporte para jaxen que es una biblioteca para
consultas xpath en Java
Con una instancia de la clase org.jdom.xpath.XPath
XPath xp = XPath.newInstance("sentencia xpath");
Esta clase para buscar elementos, implementa
los metodos
/*buscar un elemento que concuerden con nuestra sentencia*/
Element element =(Element) xp.selectSingleNode(document);
/*buscar todos los elementos que concuerden con nuestra sentencia*/
List list = xp.selectNodes(document);
Ingenio DS
Programando Soluciones
http://ingeniods.wordpres.com
11. XML
DTD
XSD CRUD en JDOM
XPATH
JDOM
Ingenio DS JDOM I
Ingenio DS JDOM II
Ingenio DS JDOM III
Ingenio DS
Programando Soluciones
http://ingeniods.wordpres.com