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