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)

Ghidul autorului de cărţi electronice
Ghidul autorului de cărţi electronice

Ai scris o carte. Foarte frumos. Dar nu ai scris-o pentru a o ţine pentru tine. Trebuie să o publici. Problema e că editurile percep preţuri foarte mari pentru buzunarele unora dintre autori, şi aceasta în mod obiectiv, datorită costurilor … Citeşte mai mult

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

WordPress este o platformă pentru site-uri web rapidă, fiabilă, cu facilități multiple pentru dezvoltatori și ușor de utilizat. Totusi, dezvoltatorii și beneficiarii au de multe ori nevoie să adauge funcționalități suplimentare pentru a răspunde nevoilor lor. Acest ghid oferă unele … Citeşte mai mult

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

Ghidul de iniţiere Google privind optimizarea pentru motoarele de căutare, Versiunea 1.1, 13 noiembrie 2008 Acest document a fost lansat iniţial ca un efort pentru a ajuta echipele Google, însă este la fel de util şi pentru webmasterii începători în … Citeşte mai mult

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.

Lasă un răspuns

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