Get it on Google Play

Validació de missatges XML amb XSD

19-06-2007
 

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());
    }
}

Leave a Reply

© Albert Coronado Calzada