Get it on Google Play
19-06-2007
 

Validació de missatges XML amb XSD

Fer servir Schemes XSD te moltes avantatges respecte fer servir DTD. Antre d’altres la possibilitat de definir valors en els atributs, quantitat de fills, etc. Per a veure això res millor que un exemple:

d1.xml

<taula nom=”clients” num_files=”2″>

<columnes num_columnes=”3″>
  <columna index=”0″ nom=”codi” descripcio=”codi del client” tipus=”enter” null=”false” vmax=”65535″/>
  <columna index=”1″ nom=”nom” descripcio=”nom del client” tipus=”cadena” null=”false” vmax=”32″/>
  <columna index=”2″ nom=”telefon” descripcio=”telefon del client” tipus=”cadena” null=”true” vmax=”12″/>
</columnes>

<files num_files=”2″>
  <fila ID=”0″ DNI=”40404032A” Nom=”Pep” Cognoms=”one” Edat=”33″ Adreca=”Alla” Professio=”Fuster”/>
  <fila ID=”1″ DNI=”60474832A” Nom=”Juan” Cognoms=”two” Edat=”21″ Adreca=”Aqui” Professio=”Lampista”/>
</files>

</taula>

d1.xsd

<xs:schema xmlns:xs=”http://www.w3.org/2001/XMLSchema”>

<xs:element name=”taula” type=”tipusTaula”/>

<xs:complexType name=”tipusTaula”>
<xs:sequence>
<xs:element name=”columnes” type=”tipusColumnes” minOccurs=”1″ maxOccurs=”1″/>
<xs:element name=”files” type=”tipusFiles” minOccurs=”1″ maxOccurs=”1″/>
</xs:sequence>
<xs:attribute name=”nom” type=”xs:string” use=”required”/>
<xs:attribute name=”num_files” type=”xs:int” use=”optional”/>
</xs:complexType>

<xs:complexType name=”tipusColumnes”>
<xs:sequence>
<xs:element name=”columna” type=”tipusColumna” minOccurs=”1″ maxOccurs=”unbounded”/>
</xs:sequence>
<xs:attribute name=”num_columnes” type=”xs:int” use=”optional”/>
</xs:complexType>

<xs:complexType name=”tipusFiles”>
<xs:sequence>
<xs:element name=”fila” type=”tipusFila” minOccurs=”0″ maxOccurs=”unbounded”/>
</xs:sequence>
<xs:attribute name=”num_files” type=”xs:int” use=”optional”/>
</xs:complexType>

<xs:complexType name=”tipusColumna”>
<xs:attribute name=”index” type=”enterPositiu” use=”required”/>
<xs:attribute name=”nom” type=”xs:string” use=”required”/>
<xs:attribute name=”descripcio” type=”xs:string” use=”required”/>
<xs:attribute name=”tipus” type=”tipusDeDada” use=”required”/>
<xs:attribute name=”null” type=”xs:boolean” use=”required”/>
<xs:attribute name=”vmax” type=”enterPositiu” use=”required”/>
</xs:complexType>

<xs:complexType name=”tipusFila”>
<xs:attribute name=”ID” type=”enterPositiu” use=”required”/>
<xs:attribute name=”DNI” type=”xs:string” use=”required”/>
<xs:attribute name=”Nom” type=”xs:string” use=”required”/>
<xs:attribute name=”Cognoms” type=”xs:string” use=”required”/>
<xs:attribute name=”Edat” type=”enterPositiu” use=”optional”/>
<xs:attribute name=”Adreca” type=”xs:string” use=”optional”/>
<xs:attribute name=”Professio” type=”xs:string” use=”optional”/>
</xs:complexType>

<xs:simpleType name=”tipusDeDada”>
<xs:restriction base=”xs:string”>
<xs:enumeration value=”enter”/>
<xs:enumeration value=”numeric”/>
<xs:enumeration value=”cadena”/>
<xs:enumeration value=”caracter”/>
<xs:enumeration value=”logic”/>
</xs:restriction>
</xs:simpleType>

<xs:simpleType name=”enterPositiu”>
<xs:restriction base=”xs:int”>
<xs:minInclusive value=”0″/>
</xs:restriction>
</xs:simpleType>

</xs:schema>

Aquests son un exemple de fitxer XML i el seu schema que el valida. Resulta un exemple molt simple però que ens permet fer una idea de fins a quin punt podem arribar a matisar la definició de l’estructura d’un XML.

Ara toca la part de validar-lo. Per això he fet aquest exemple de codi que s’encarrega de la validació del fitxer XML.

import java.io.*;
import javax.xml.*;
import javax.xml.transform.stream.*;
import javax.xml.validation.*;
import org.xml.sax.*;

class XMLReaderValidator {

  public static void main(String[] args) {

    try {
    SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = sf.newSchema(new File( “d1.xsd” ));

    Validator validator = schema.newValidator();
    validator.setErrorHandler(new XSDErrorHandler());

    validator.validate(new StreamSource(“d1.xml”));
    } catch (Exception ex) { }
  }
}

class XSDErrorHandler implements org.xml.sax.ErrorHandler{

  public XSDErrorHandler() { }

  public void error(org.xml.sax.SAXParseException s) throws org.xml.sax.SAXException {
    System.out.println(“ERROR: Line “+s.getLineNumber()+” Column “+s.getColumnNumber()+” ” + s.toString());
    }

  public void fatalError(org.xml.sax.SAXParseException s) throws org.xml.sax.SAXException {
    System.out.println(“FATAL ERROR: Line “+s.getLineNumber()+” Column “+s.getColumnNumber()+” ” + s.toString());
    }

  public void warning(org.xml.sax.SAXParseException s) throws org.xml.sax.SAXException {
    System.out.println(“WARNING: Line “+s.getLineNumber()+” Column “+s.getColumnNumber()+” ” + s.toString());
    }
}

Si te ha servido, por favor comparte

Leave a Reply