Exercici XML RESOLT

Enunciat

Volem gestionar un inventari de productes electrònics per a una botiga. Cada producte té diferents atributs com nom, preu, marca i disponibilitat.

Exemple de tres productes:

Producte Preu Marca Disponibilitat
Laptop Dell XPS 15 1399 EUR Dell 10 unitats
Smartphone iPhone 13 999 EUR Apple 15 unitats
TV Sony Bravia 4K (65”) 1299 EUR Sony 5 unitats

Solució 1. Utilitzant elements separats

<?xml version="1.0" encoding="UTF-8"?>
<inventari>

    <!-- Cada producte té subelements per a cada dada -->
    <producte>
        <nom>Laptop Dell XPS 15</nom>
        <preu>1399 EUR</preu>
        <marca>Dell</marca>
        <disponibilitat>10 unitats</disponibilitat>
    </producte>

    <producte>
        <nom>Smartphone iPhone 13</nom>
        <preu>999 EUR</preu>
        <marca>Apple</marca>
        <disponibilitat>15 unitats</disponibilitat>
    </producte>

    <producte>
        <nom>TV Sony Bravia 4K de 65 polzades</nom>
        <preu>1299 EUR</preu>
        <marca>Sony</marca>
        <disponibilitat>5 unitats</disponibilitat>
    </producte>

</inventari>

Avantatges

  • Molt clar i llegible: cada dada està en el seu element.
  • Fàcil d’ampliar amb més informació (color, mida, característiques tècniques).

Desavantatges

  • El document XML es fa més llarg amb molts productes/atributs.
  • Pot ser menys eficient en conjunts de dades molt grans.

Solució 2. Utilitzant atributs i elements

<?xml version="1.0" encoding="UTF-8"?>
<inventari>

    <!-- El nom es guarda com a atribut i la resta com a elements -->
    <producte nom="Laptop Dell XPS 15">
        <preu>1399 EUR</preu>
        <marca>Dell</marca>
        <disponibilitat>10 unitats</disponibilitat>
    </producte>

    <producte nom="Smartphone iPhone 13">
        <preu>999 EUR</preu>
        <marca>Apple</marca>
        <disponibilitat>15 unitats</disponibilitat>
    </producte>

    <producte nom="TV Sony Bravia 4K de 65 polzades">
        <preu>1299 EUR</preu>
        <marca>Sony</marca>
        <disponibilitat>5 unitats</disponibilitat>
    </producte>

</inventari>

Avantatges

  • Més concís que la Solució 1 (el nom no ocupa línia extra).
  • Equilibri: combina atributs per a dades identificadores i elements per a dades de contingut.

Desavantatges

  • Pot resultar inconsistent si barregem massa atributs i elements.
  • No tan clar si el nombre d’atributs creix molt.

Solució 3. Utilitzant només atributs

<?xml version="1.0" encoding="UTF-8"?>
<inventari>

    <!-- Tota la informació està dins dels atributs -->
    <producte 
        nom="Laptop Dell XPS 15" 
        preu="1399" 
        moneda="EUR" 
        marca="Dell" 
        disponibilitat="10" 
        unitats="unitats"/>

    <producte 
        nom="Smartphone iPhone 13" 
        preu="999" 
        moneda="EUR" 
        marca="Apple" 
        disponibilitat="15" 
        unitats="unitats"/>

    <producte 
        nom="TV Sony Bravia 4K de 65 polzades" 
        preu="1299" 
        moneda="EUR" 
        marca="Sony" 
        disponibilitat="5" 
        unitats="unitats"/>

</inventari>

Avantatges

  • Molt compacte: tota la informació en una sola línia per producte.
  • Processament més senzill si sols cal llegir valors ràpidament.

Desavantatges

  • Menys llegible per a humans.
  • Poc flexible: difícil afegir descripcions llargues, llistes o subelements.

Comparació entre les tres solucions

Solució Estil principal Llegibilitat Compactació Flexibilitat
1 Tot amb elements Molt alta Baixa Molt alta
2 Mixt atributs/elements Bona Mitjana Mitjana
3 Tot amb atributs Baixa Molt alta Baixa

## Qüestions resoltes

1. És ben format? Marca com a correctes o incorrectes i corregeix

<article>Disquet</article>
<article>Disquet</Article>
<article quantitat=3>Disquet</article>

Solució:

  • <article>Disquet</article>Correcte
  • <article>Disquet</Article>Incorrecte (majúscules/minúscules). Correcte: <article>Disquet</article>
  • <article quantitat=3>Disquet</article>Incorrecte (atribut sense cometes). Correcte: <article quantitat="3">Disquet</article>

2. Entitats: escriu correctament en XML

5 < 10 & "hola"

Solució:

<frase>5 &lt; 10 &amp; &quot;hola&quot;</frase>

3. CDATA: inclou aquest HTML dins d’un element <exemple> usant CDATA

<p>Hola món</p>

Solució:

<exemple>
  <![CDATA[
    <p>Hola món</p>
  ]]>
</exemple>

4. Namespaces: combina dos elements <nom> (alumnes i professors) en un mateix document XML evitant conflictes amb namespaces

Solució:

<classe xmlns:al="http://exemple.org/alumnes"
        xmlns:pr="http://exemple.org/professors">
  <al:nom>Ana</al:nom>
  <pr:nom>Laura</pr:nom>
</classe>

5. Validació amb eina: crea un fitxer alumne.xml i comprova amb xmllint si està ben format

Solució:

xmllint --noout alumne.xml

Altres

1. Declaració XML: escriu la declaració recomanada per a un document en UTF-8 independent.

Solució:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

2. Arrel única: corregeix l’error (dues arrels).

<persona>Ana</persona>
<persona>Pere</persona>

Solució:

<persones>
  <persona>Ana</persona>
  <persona>Pere</persona>
</persones>

3. Etiquetes niades: és correcte? Corregeix si cal.

<inventari>
  <article>Disquet</inventari>
</article>

Solució: Incorrecte (mal niat).

<inventari>
  <article>Disquet</article>
</inventari>

4. Noms vàlids: quins són invàlids?

<1Cotxe/>
<_usuari/>
<Aitor Tilla/>
<producte-123/>

Solució:

  • <1Cotxe/> → invàlid (no pot començar per número).
  • <Aitor Tilla/> → invàlid (espais prohibits). Vàlids: <_usuari/>, <producte-123/>.

5. Majúscules/minúscules: són el mateix element?

<Article>Hola</Article>
<article>Hola</article>

Solució: No, són diferents perquè XML és case-sensitive.


6. Atributs: corregeix l’error.

<alumne id=1 nom=Lola/>

Solució:

<alumne id="1" nom="Lola"/>

7. Entitats: escriu correctament.

Resultat: 5 < 10 & 3 > 2

Solució:

<res>Resultat: 5 &lt; 10 &amp; 3 &gt; 2</res>

8. CDATA: inclou aquest codi dins d’un element <script> sense errors XML.

if (x < 10 && y > 5) alert("Hola");

Solució:

<script>
  <![CDATA[
    if (x < 10 && y > 5) alert("Hola");
  ]]>
</script>

9. Comentaris: escriu un comentari vàlid que diga “Temporal”.

Solució:

<!-- Temporal -->

10. Processing Instruction: afegeix un full d’estil estils.css a un XML.

Solució:

<?xml-stylesheet type="text/css" href="estils.css"?>

11. Namespaces: escriu un document amb un <al:nom> (alumnes) i <pr:nom> (professors).

Solució:

<classe xmlns:al="http://exemple.org/alumnes"
        xmlns:pr="http://exemple.org/professors">
  <al:nom>Ana</al:nom>
  <pr:nom>Laura</pr:nom>
</classe>

12. Namespace per defecte: fes que <nom> siga d’alumnes i <pr:nom> de professors.

Solució:

<classe xmlns="http://exemple.org/alumnes"
        xmlns:pr="http://exemple.org/professors">
  <nom>Ana</nom>
  <pr:nom>Laura</pr:nom>
</classe>

13. Errors de ben formació: detecta i corregeix.

<!- Error ->
<text>Hola & adeu</text>
<Article>Hola</article>

Solució:

<!-- Error -->
<text>Hola &amp; adeu</text>
<Article>Hola</Article>

14. Validació amb eina: comprova si alumne.xml és ben format.

Solució:

xmllint --noout alumne.xml

15. Document complet: crea un XML amb arrel <inventari> que continga un producte amb nom “Ratolí”, preu “25 EUR” i estoc “12 unitats”.

Solució:

<?xml version="1.0" encoding="UTF-8"?>
<inventari>
  <producte nom="Ratolí">
    <preu moneda="EUR">25</preu>
    <estoc unitat="unitats">12</estoc>
  </producte>
</inventari>