XML/Relazione uno-uno

< XML
Indice del libro

Obiettivi di apprendimento

  • 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

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

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
<?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

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

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

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

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

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

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

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

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