Facciamo un esempio al contrario: assegnano un nutrito flle XML e chiediamo all’alunno di costruire lo schema XSD. Proviamo ad individuare le criticità e le commentiamo insieme.
Indice dei contenuti
Il file XML
<ordine>
<carrello>
<articolo>
<categoria>latte</categoria>
<confezioni>2</confezioni>
<confezione>
<tipologia>parzialmente scremato</tipologia>
<grandezza unita="lt">1</grandezza>
<scadenza unita="gg" giorno_riferimento="consegna">4</scadenza>
</confezione>
</articolo>
<articolo>
<categoria>gelato</categoria>
<marca>Slurp</marca>
<gusto>Limone</gusto>
<confezioni>1</confezioni>
<confezione>
<peso unita="gr">500</peso>
</confezione>
</articolo>
<articolo>
<categoria>caffè</categoria>
<marca>Hug</marca>
<confezioni>1</confezioni>
<confezione>
<quantita unita="bustine">20</quantita>
</confezione>
</articolo>
<articolo>
<categoria>pane</categoria>
<confezioni>2</confezioni>
<confezione>
<peso unita="gr">500</peso>
<ingrediente modalita="assente">sale</ingrediente>
</confezione>
</articolo>
<articolo>
<categoria>pomodoro</categoria>
<confezione>
<tipologia>oblungo rosso</tipologia>
<peso unita="kg">0.5</peso>
</confezione>
</articolo>
<articolo>
<categoria>acqua</categoria>
<confezioni>1</confezioni>
<confezione>
<tipologia>naturale</tipologia>
<quantita unita="bottiglie">6</quantita>
</confezione>
</articolo>
</carrello>
</ordine>
Il file XSD
Procediamo per step incrementali. La radice è semplice da individuare come anche l’elemento carrello. E’ palese che siano tipi complessi Possiamo quindi cominciare a buttare giù qualche riga del nostro schema xml.
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="ordine">
<xs:complexType>
<xs:element name="carrello">
<xs:complexType>
...
</xs:complexType>
</xs:complexType>
</xs:element>
</xs:schema>
E’ il turno del tag articolo. E’ un tag senza particolari attributi quindi lo possiamo dichiarare generico ma pare si possa ripetere più volte e contiene più elementi complessi. La parte un po’ più delicata. Per ogni articolo vediamo come i marcatori dei tag non siano esattamente uguali, ma variano tra articolo ed articolo. Controlliamo se sono messi in modo opzionale ma seguono comunque un criterio di ordine tracciabile. Intanto tutti hanno una categoria espressa. Possiamo procedere con inserirlo attraverso un element di tipo stringa senza specificare minOccurs che ne caratterizza l’opzionalità ma al più maxOccurs pari ad 1. Poi possiamo individuare senza ordine preciso o obbligatorietà gli elementi marca, gusto, confezioni, confezione. Di questi, i primi quattro sono elementi in cui fornire solo il tipo, il numero minimo di occorrenze pari a zero per indicare l’opzionalità ma massimo pari ad 1.
<xs:element name="articolo" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="categoria" type="xs:string" maxOccurs="1" />
<xs:element name="marca" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="gusto" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="confezioni" type="xs:integer" minOccurs="0" maxOccurs="1" />
<xs:element name="confezione" minOccurs="0" maxOccurs="1">
...
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
Discorso più complesso per l’elemento confezione. Questo è un tipo a sua volta complesso con una sequenza di elementi tipologia, peso, quantita, ingrediente, grandezza e scadenza. Di questi tutti sono opzionali con una occorrenza max pari ad 1 tranne ingrediente che può essere ripetuto più volte. Ognuno di questi è un tipo complesso ma dal contenuto semplice per poter specificare il tipo e gli attributi.
<xs:element name="confezione" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="tipologia" type="xs:string" minOccurs="0" />
<xs:element name="peso" minOccurs="0" maxOccurs="1">
...
</xs:element>
<xs:element name="quantita" minOccurs="0" maxOccurs="1">
...
</xs:element>
<xs:element name="ingrediente" minOccurs="0" maxOccurs="unbounded" >
...
</xs:element>
<xs:element name="grandezza" minOccurs="0" maxOccurs="1">
...
</xs:element>
<xs:element name="scadenza" minOccurs="0" maxOccurs="1">
...
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
Listato XSD completo
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="ordine">
<xs:complexType>
<xs:sequence>
<xs:element name="carrello">
<xs:complexType>
<xs:sequence>
<xs:element name="articolo" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="categoria" type="xs:string" maxOccurs="1" />
<xs:element name="marca" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="gusto" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="confezioni" type="xs:integer" minOccurs="0" maxOccurs="1" />
<xs:element name="confezione" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="tipologia" type="xs:string" minOccurs="0" />
<xs:element name="peso" minOccurs="0" >
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="unita" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="quantita" minOccurs="0" >
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:integer">
<xs:attribute name="unita" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="ingrediente" minOccurs="0" maxOccurs="unbounded" >
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="modalita" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="grandezza" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:integer">
<xs:attribute name="unita" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="scadenza" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:integer">
<xs:attribute name="unita" type="xs:string"/>
<xs:attribute name="giorno_riferimento" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Listato completo
Li trovate su github.com
Ultima modifica 6 Aprile 2023