Home » Articole » Articole » Calculatoare » Dezvoltarea web » XML » Relații recursive în XML

Relații recursive în XML

postat în: XML 0

Relațiile recursive sunt un concept interesant și mai complex decât relațiile pe care le-ați văzut în secțiunile precedente. O relație recursivă apare atunci când există o relație între o entitate și ea însăși. De exemplu, o relație recursivă unu-la-mulți apare atunci când un angajat este managerul altor angajați. Entitatea angajat este legată de ea însăși și există o relație unu-la-mulți între un angajat (manager) și mulți alți angajați (persoanele care raportează managerului). Datorită naturii mai complexe a acestor relații, vom avea nevoie de metode puțin mai complexe de mapare a acestora la o schemă și de a le afișa într-o foaie de stil.

Relația recursivă unu-la-unu

Continuând cu modelul ghidului turistic, vom dezvolta o schemă care arată orașele care au găzduit Jocurile Olimpice și orașul gazdă anterior. Deoarece gazda anterioară este un alt oraș și doar un oraș poate fi gazda anterioară, aceasta este o relație recursivă unu la unu.

Relații recursive în XML

host.xsd (schemă XML pentru un model recursiv unu-la-unu)

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
attributeFormDefault="unqualified">

<xsd:element name="cities">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="city" type="cityType" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

<xsd:complexType name="cityType">
  <xsd:sequence>
    <xsd:element name="cityID" type="xsd:ID"/>
     <xsd:element name="cityName" type="xsd:string"/>
     <xsd:element name="cityCountry" type="xsd:string"/>
     <xsd:element name="cityPop" type="xsd:integer"/>
     <xsd:element name="cityHostYr" type="xsd:integer"/>
     <xsd:element name="cityPreviousHost" type="xsd:IDREF" minOccurs="0" maxOccurs="1"/>
  </xsd:sequence>
</xsd:complexType>
</xsd:schema>

Figura 1: Schema XML pentru entitatea orașul gazdă

host.xml (document XML pentru un model recursiv unu-la-unu)

<?xml version="1.0" encoding="UTF-8"?>
<cities xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:noNamespaceSchemaLocation='host.xsd'>
  <city>
    <cityID>c1</cityID>
    <cityName>Atlanta</cityName>
    <cityCountry>USA</cityCountry>
    <cityPop>4000000</cityPop>
    <cityHostYr>1996</cityHostYr>    
  </city>
  <city>
    <cityID>c2</cityID>
    <cityName>Sydney</cityName>
    <cityCountry>Australia</cityCountry>
    <cityPop>4000000</cityPop>
    <cityHostYr>2000</cityHostYr>  
    <cityPreviousHost>c1</cityPreviousHost>   
  </city>
  <city>
    <cityID>c3</cityID>
    <cityName>Athens</cityName>
    <cityCountry>Greece</cityCountry>
    <cityPop>3500000</cityPop>
    <cityHostYr>2004</cityHostYr>  
    <cityPreviousHost>c2</cityPreviousHost>   
  </city>
</cities>

Figura 2: Document XML pentru orașul gazdă olimpic

Relația recursivă unu-la-mulți

O echipă sportivă ipotetică este împărțită în echipe, fiecare echipă având un căpitan. Fiecare persoană din echipă este un jucător, indiferent dacă este căpitan de echipă. Deoarece un căpitan de echipă este un jucător, această situație îndeplinește definiția unei relații recursive – un căpitan de echipă este, de asemenea, un jucător și are o relație unu-la-mulți cu ceilalți jucători. Aceasta este o relație recursivă unu-la-mulți, deoarece un căpitan are mulți jucători sub el/ea. Vezi exemplul de mai jos pentru cum să modelezi relația.

team.xsd (schemă XML pentru un model recursiv unu-la-mulți)

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">
<xsd:element name="team">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="player" type="playerType" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>
  <xsd:complexType name="playerType">
    <xsd:sequence>
      <xsd:element name="playerID" type="xsd:ID"/>
      <xsd:element name="playerName" type="xsd:string"/>
      <xsd:element name="playerCap" type="playerC" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="playerC">
    <xsd:sequence>
      <xsd:element name="memberOf" type="xsd:IDREF"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

Figura 3: Schema XML pentru entitatea echipă

team.xml (document XML pentru un model recursiv unu-la-mulți)

<?xml version="1.0" encoding="UTF-8"?>
<team xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:noNamespaceSchemaLocation='Recursive1toMSchema.xsd'>
<player>
   <playerID>c1</playerID>
   <playerName>Tommy Jones</playerName>
   <playerCap>
      <memberof>c3</memberof>
   </playerCap>
</player>
<player>
   <playerID>c2</playerID>
   <playerName>Eddie Thomas</playerName>
   <playerCap>
      <memberof>c3</memberof>
   </playerCap>
</player>
<player>
   <playerID>c3</playerID>
   <playerName>Sean McCombs</playerName>
</player>
<player>
   <playerID>c4</playerID>
   <playerName>Patrick O’Shea</playerName>
   <playerCap>
      <memberof>c3</memberof>
    </playerCap>
</player>
</team>

Figura 4: Document XML pentru entitatea echipă

Structură recursivă naturală unu-la-mulți

O abordare mai naturală pentru majoritatea relațiilor recursive unu-la-mai multe este utilizarea naturii ierarhice a XML pentru a reprezenta direct ierarhia. Luați în considerare Locations:

<?xml version="1.0" encoding="UTF-8"?>
<location type="country">
  <name>USA</name>
  <sub-locations>
    <location type="state">
      <name>Ohio</name>
      <sub-locations>
        <location type="city"><name>Akron</name></location>
        <location type="city"><name>Columbus</name></location>
      </sub-location>
    </location>
  </sub-locations>
</location>

Relația recursivă multi-la-mulți

Credeți că deja simțiți relațiile recursive? Ei bine, mai există a treia și ultima relație de adăugat la repertoriul dvs. – recursiva multi-la-mulți. Un exemplu obișnuit de relație recursivă multi-la-mulți este atunci când un articol poate fi compus din mai multe articole de același tip de date ca și el însuși și fiecare dintre aceste sub-articole poate aparține unui alt element părinte de același tip de date. Sună confuz? Să ne uităm la exemplul unui produs care poate consta dintr-un singur articol sau mai multe articole (adică un produs ambalat). Exemplul de mai jos descrie produse turistice care pot fi ambalate împreună pentru a crea un produs nou.

product.xsd (schemă XML pentru un model recursiv multi-la-mulți)

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">
    <xsd:element name="products">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="product" type="prodType" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:complexType name="prodType">
        <xsd:sequence>
            <xsd:element name="prodID" type="xsd:ID"/>
            <xsd:element name="prodName" type="xsd:string"/>
            <xsd:element name="prodCost" type="xsd:decimal" minOccurs="0"/>
            <xsd:element name="prodPrice" type="xsd:decimal"/>
            <xsd:element name="components" type="componentsType" minOccurs="0" maxOccurs="1"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="componentsType">
        <xsd:sequence>
            <xsd:element name="component" type="xsd:IDREF"/>
            <xsd:element name="componentqty" type="xsd:integer"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

Figura 5: Schema XML pentru Entitatea de produs

product.xml (document XML pentru un model recursiv multi-la-mulți)

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="product.xsl"?>
<products xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="product.xsd">
    <product>
        <prodID>p1000</prodID>
        <prodName>Animal photography kit</prodName>
        <prodPrice>725</prodPrice>
        <components>
            <component>p101</component>
            <componentqty>1</componentqty>
        </components>
    </product>
    <product>
        <prodID>p101</prodID>
        <prodName>Camera case</prodName>
        <prodCost>150</prodCost>
        <prodPrice>300</prodPrice>
    </product>
</products>

Figura 6: Document XML pentru entitatea produs

Rezumat

Când copilul are același tip de date ca și părintele său într-o relație de date tip părinte-copil, acesta este un semn al existenței unei relații recursive. Elementele xsd:ID și xsd:IDREF pot fi utilizate într-o schemă pentru a crea valori cheie primară-cheie externă într-un document XML.

(Include texte din Wikibooks traduse și adaptate de Nicolae Sfetcu)

Promovarea afacerilor prin campanii de marketing online
Promovarea afacerilor prin campanii de marketing online

Descoperă cum să-ți promovezi afacerea eficient în era digitală!

Nu a fost votat Interval de prețuri: 23.09 lei până la 63.44 lei Selectează opțiunile Acest produs are mai multe variații. Opțiunile pot fi alese în pagina produsului.
Rețele de comunicații 5G
Rețele de comunicații 5G

Descoperă cum 5G transformă lumea și pregătește-te să fii parte din viitor.

Nu a fost votat Interval de prețuri: 13.84 lei până la 42.06 lei Selectează opțiunile Acest produs are mai multe variații. Opțiunile pot fi alese în pagina produsului.
Telelucru (Telework)
Telelucru (Telework)

Resursa ideală pentru profesioniști, angajatori și freelanceri care vor să navigheze eficient în era muncii la distanță.

Nu a fost votat 0.00 lei Selectează opțiunile Acest produs are mai multe variații. Opțiunile pot fi alese în pagina produsului.


Descoperă mai multe la MultiMedia

Abonează-te ca să primești ultimele articole prin email.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *