mercoledì 26 settembre 2012

Xml con validazione xsd

Supponiamo di creare una richiesta di un articolo di guanti da moto con un file xml e validarlo secondo delle regole xsd.
La richiesta come esempio avrà una data, l'articolo fatto da codice nome descrizione e costo, una descrizione, e due file in allegato.
In una directory (ad esempio C:\xsd) creiamo un file xsd di richiesta "request.xsd" e un file dell'articolo "article.xsd" impostando alcune regole.
Da notare come nel file "request.xsd" è incluso il file "article.xsd": l'oggetto "request" incorpora l'elemento di riferimento "article" da cui si possono referenziare gli elementi.
Nella stessa directory inseriamo il file xml risultante (o creato da vari tool disponibili su internet) includendo l'unico file di validazione "request.xsd".
Se si dispone di un tool di validazione, provando a modificare alcuni valori sul file xml diversi da quelli che si sono impostati, verrà generato un errore.
Si seguito i sorgenti dei due file "request.xsd" e "article.xsd" e il file "gloves.xml".

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="request" xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:ar="ARTICLE" targetNamespace="request" 
 elementFormDefault="qualified" attributeFormDefault="unqualified">
 <xs:import namespace="ARTICLE" 
 schemaLocation="C:\xsd\article.xsd"/>
 <xs:element name="ATTACHMENTS">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="ATTACHMENTS_OK"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
 <xs:element name="ATTACHMENTS_OK">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="ATTACHMENT_1"/>
    <xs:element ref="ATTACHMENT_2"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
 <xs:element name="ATTACHMENT_1" type="xs:string"/>
 <xs:element name="ATTACHMENT_2" type="xs:string"/>
 <xs:element name="COD_ART">
  <xs:simpleType>
   <xs:restriction base="xs:string">
    <xs:maxLength value="25"/>
   </xs:restriction>
  </xs:simpleType>
 </xs:element>
 <xs:element name="DATE_REQ" type="xs:string"/>
 <xs:element name="DESCRIPTION" type="xs:string"/>
 <xs:simpleType name="ID">
  <xs:restriction base="xs:int"/>
 </xs:simpleType>
 <xs:element name="REQUEST">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="ID" type="ID"/>
    <xs:element ref="DATE_REQ"/>
    <xs:element ref="ar:ARTICLE"/>
    <xs:element ref="DESCRIPTION"/>
    <xs:element ref="ATTACHMENTS"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>

<pre class="code_style" name="code">
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="ARTICLE" xmlns:xs="http://www.w3.org/2001/XMLSchema"
 targetNamespace="ARTICLE"
 elementFormDefault="qualified" attributeFormDefault="unqualified">
 <xs:element name="COST" type="xs:float"/>
 <xs:element name="DESCRIPTION" type="xs:string"/>
 <xs:simpleType name="ID">
  <xs:restriction base="xs:int"/>
 </xs:simpleType>
 <xs:element name="NAME">
  <xs:simpleType>
   <xs:restriction base="xs:string">
    <xs:maxLength value="25"/>
   </xs:restriction>
  </xs:simpleType>
 </xs:element>
 <xs:element name="ARTICLE">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="ID" type="ID"/>
    <xs:element ref="NAME"/>
    <xs:element ref="DESCRIPTION"/>
    <xs:element ref="COST"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>
<REQUEST xmlns="request" xmlns:ar="ARTICLE" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="request
C:\xsd\request.xsd">
 <ID>1</ID>
 <DATE_REQ>10/11/2010</DATE_REQ>
 <ar:ARTICLE>
  <ar:ID>10</ar:ID>
  <ar:NAME>Gloves</ar:NAME>
  <ar:DESCRIPTION>Motorcycle gloves</ar:DESCRIPTION>
  <ar:COST>50</ar:COST>
 </ar:ARTICLE>
 <DESCRIPTION/>
 <ATTACHMENTS>
  <ATTACHMENTS_OK>
   <ATTACHMENT_1>img_gloves.png</ATTACHMENT_1>
   <ATTACHMENT_2>notes.txt</ATTACHMENT_2>
  </ATTACHMENTS_OK>
 </ATTACHMENTS>
</REQUEST>