XML/Relazione uno-uno
- Creare uno schema per un modello dati contenente una relazione 1:1
- Inserire restrizioni su elementi o attributi in uno schema XML
- Specificare valori fissi o predefiniti per un elemento in uno schema XML
Nel capitolo precedente sono state introdotte alcune nuove caratteristiche degli schemi XML, documenti e fogli di stile, oltre a come modellare una relazione uno-a-molti. In questo capitolo introdurremo la modellazione di una relazione one-to-one in XML. Introdurremo anche altre caratteristiche di uno schema XML.
Una relazione uno a uno (1:1)
[modifica | modifica sorgente]Il diagramma seguente mostra un rapporto uno a uno e uno a molti. La relazione uno-uno registra ogni paese come un'unica destinazione top.
Schema XML
[modifica | modifica sorgente]Nel modello di dati dell'esempio 4.1 è rappresentata una relazione uno a uno (1:1). L'aggiunta del paese e della destinazione al modello dati consente la relazione 1:1 denominata topDestination. Un paese ha molte destinazioni diverse, ma solo una destinazione top. Lo schema XML nell'esempio 4.2 mostra come rappresentare una relazione 1:1 in uno schema XML.
Esempio di schema XML
[modifica | modifica sorgente]<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">
<!--
Tour Guide
-->
<xsd:element name="tourGuide">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="country" type="countryDetails" minOccurs="1" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<!--
Country
-->
<xsd:complexType name="countryDetails">
<xsd:sequence>
<xsd:element name="countryName" type="xsd:string" minOccurs="1" maxOccurs="1"/>
<xsd:element name="population" type="xsd:integer" minOccurs="0" maxOccurs="1" default="0"/>
<xsd:element name="continent" minOccurs="0" maxOccurs="1">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Asia"/>
<xsd:enumeration value="Africa"/>
<xsd:enumeration value="Australasia"/>
<xsd:enumeration value="Europe"/>
<xsd:enumeration value="North America"/>
<xsd:enumeration value="South America"/>
<xsd:enumeration value="Antarctica"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="topDestination" type="destinationDetails" minOccurs="0" maxOccurs="1"/>
<xsd:element name="destination" type="destinationDetails" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<!--
Destination
-->
<xsd:complexType name="destinationDetails">
<xsd:all>
<xsd:element name="destinationName" type="xsd:string"/>
<xsd:element name="description" type="xsd:string"/>
<xsd:element name="streetAddress" type="xsd:string" minOccurs="0"/>
<xsd:element name="telephoneNumber" type="xsd:string" minOccurs="0"/>
<xsd:element name="websiteURL" type="xsd:anyURI" minOccurs="0"/>
</xsd:all>
</xsd:complexType>
</xsd:schema>
Esempio 4.2: Schema XML per una relazione 1:1
Nuovi elementi nello schema
[modifica | modifica sorgente]Esaminiamo i nuovi elementi e attributi nello schema dell'esempio 4.2.
- Country è un tipo complesso definito in City per rappresentare il rapporto 1:M tra un paese e le sue città.
- Destination è un tipo complesso definito in Country per rappresentare la relazione 1:M tra un paese e le sue numerose destinazioni.
- topDestination è un tipo complesso definito in Country per rappresentare il rapporto 1:1 tra un paese e la sua destinazione principale.
Restrizioni nello schema
[modifica | modifica sorgente]Nel capitolo precedente è stata introdotta l'imposizione di restrizioni sugli elementi; tuttavia, ci sono restrizioni potenzialmente più utili che possono essere imposte su un elemento. Le restrizioni possono essere applicate agli elementi e agli attributi che influenzano il modo in cui il processore gestisce i caratteri degli spazi bianchi:
<xsd:element name="streetAddress">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:whiteSpace value="preserve"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
Spazio bianco e vincoli di lunghezza
[modifica | modifica sorgente]Il vincolo whiteSpace è impostato su "preserve" (conserva), il che significa che il processore XML non rimuoverà nessuno dei caratteri dello spazio bianco. Altre utili restrizioni sono:
- Replace - il processore XML sostituirà tutti i caratteri degli spazi bianchi con spazi.
- <xsd:whiteSpace value="replace"/>
- Collapse – il processore rimuoverà tutti i caratteri degli spazi bianchi.
- <xsd:whiteSpace value="collapse"/>
- Length, maxLength, minLength — la lunghezza dell'elemento può essere fissa o può avere un intervallo predefinito.
- <xsd:length value="8"/>
- <xsd:minLength value="5"/>
- <xsd:maxLength value="8"/>
Indicatori d'ordine
[modifica | modifica sorgente]Oltre a porre restrizioni sugli elementi, gli indicatori di ordine possono essere utilizzati per definire in quali elementi di ordine dovrebbero essere presenti.
Tutti gli indicatori
[modifica | modifica sorgente]L'indicatore <all> specifica per impostazione predefinita che gli elementi figlio possono apparire in qualsiasi ordine e che ogni elemento figlio deve comparire una sola volta e una sola volta:
<xsd:element name="person">
<xsd:complexType>
<xsd:all>
<xsd:element name="firstname" type="xsd:string"/>
<xsd:element name="lastname" type="xsd:string"/>
</xsd:all>
</xsd:complexType>
</xsd:element>
Indicatore di scelta
[modifica | modifica sorgente]L'indicatore <choice> specifica che può esserci un elemento figlio o un altro:
<xsd:element name="person">
<xsd:complexType>
<xsd:choice>
<xsd:element name="employee" type="employee"/>
<xsd:element name="visitor" type="visitor"/>
</xsd:choice>
</xsd:complexType>
</xsd:element>
Indicatore di sequenza
[modifica | modifica sorgente]L'indicatore <sequence> specifica che gli elementi figlio devono apparire in un ordine specifico:
<xsd:element name="person">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="firstname" type="xsd:string"/>
<xsd:element name="lastname" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
Documento XML
[modifica | modifica sorgente]Il documento XML dell'esempio 4.3 mostra come i nuovi elementi (paese e destinazione) definiti nello schema XML dell'esempio 4.2 sono utilizzati in un documento XML. Si noti che gli elementi figli di <topDestination> possono apparire in qualsiasi ordine a causa dell'indicatore <xsd:all> utilizzato nello schema.
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="newXMLSchema.xsl" media="screen"?>
<tourGuide xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="XMLSchema.xsd">
<!--
Malaysia
-->
<country>
<countryName>Malaysia</countryName>
<population>22229040</population>
<continent>Asia</continent>
<topDestination>
<description>A popular duty-free island north of Penang.</description>
<destinationName>Pulau Langkawi</destinationName>
</topDestination>
<destination>
<destinationName>Muzium Di-Raja</destinationName>
<description>The original palace of the Sultan</description>
<streetAddress>122 Muzium Road</streetAddress>
<telephoneNumber>48494030</telephoneNumber>
<websiteURL>www.muziumdiraja.com</websiteURL>
</destination>
<destination>
<destinationName>Kinabalu National Park</destinationName>
<description>A national park</description>
<streetAddress>54 Ocean View Drive</streetAddress>
<telephoneNumber>4847101</telephoneNumber>
<websiteURL>www.kinabalu.com</websiteURL>
</destination>
</country>
<!--
Belize
-->
<country>
<countryName>Belize</countryName>
<population>249183</population>
<continent>South America</continent>
<topDestination>
<destinationName>San Pedro</destinationName>
<description>San Pedro is an island off the coast of Belize</description>
</topDestination>
<destination>
<destinationName>Belize City</destinationName>
<description>Belize City is the former capital of Belize</description>
<websiteURL>www.belizecity.com</websiteURL>
</destination>
<destination>
<destinationName>Xunantunich</destinationName>
<description>Mayan ruins</description>
<streetAddress>4 High Street</streetAddress>
<telephoneNumber>011770801</telephoneNumber>
</destination>
</country>
</tourGuide>
esempio 4.3: Documento XML Document per una relazione 1:1