Externe data: XML-voorbeelden

XML-data is rechtstreeks beschikbaar via de gekozen Smarty-identifier. Elementen en attributen uit je feed kun je direct uitlezen in dezelfde structuur.

Stel je XML-bestand ziet er zo uit:

<catalogus>
  <naam>Kledingwinkel</naam>
  <product id="item19" type="kleding">
    <id>19</id>
    <naam>T-shirt</naam>
    <eigenschappen>
      <maat>L</maat>
      <kleur>Blauw</kleur>
    </eigenschappen>
    <prijs valuta="EUR">19.95</prijs>
  </product>
  <product id="item20" type="kleding">
    <id>20</id>
    <naam>Jas</naam>
    <eigenschappen>
      <maat>XL</maat>
      <kleur>Zwart</kleur>
    </eigenschappen>
    <prijs valuta="EUR">89.95</prijs>
  </product>
</catalogus>

Na het koppelen van de feed maak je zelf een identifier aan, bijvoorbeeld kleding. De inhoud van je XML wordt dan beschikbaar als: {$kleding}.

Elementen uitlezen

De naam van het eerste product:

{$kleding.catalogus.product[0].naam}

De prijs van het tweede product:

{$kleding.catalogus.product[1].prijs}

De maat van het eerste product:

{$kleding.catalogus.product[0].eigenschappen.maat}

Herhalende elementen met {foreach}

Bij elementen die meerdere keren voorkomen gebruik je een {foreach}-loop:

{foreach $kleding.catalogus.product as $product}
  <h2>{$product.naam}</h2>
  <p>Prijs: {$product.prijs} {$product.prijs.valuta}</p>
  <p>Maat: {$product.eigenschappen.maat}</p>
  <p>Kleur: {$product.eigenschappen.kleur}</p>
{/foreach}

Attributen uitlezen

In de meeste gevallen kun je attributen rechtstreeks gebruiken, bijvoorbeeld:

{$product.id}
{$product.prijs.valuta}

Alleen als een element én een attribuut én een child-element met dezelfde naam heeft, ontstaat er een conflict. In dat geval gebruik je de speciale _attributes-eigenschap om toch het attribuut op te vragen:

{$product._attributes.id}

Dit komt zelden voor, omdat elementen en attributen meestal verschillende namen hebben.

Namespaces uitlezen

Soms bevat een XML-bestand elementen met een namespace, bijvoorbeeld:

<product>
  <ns:details>
    <fabrikant>Voorbeeld bedrijf</fabrikant>
  </ns:details>
</product>

Omdat een dubbele punt niet werkt in Smarty, gebruik je vierkante haken:

{$product["ns:details"].fabrikant}

Speciale eigenschappen: alleen in uitzonderlijke gevallen nodig

Smarty biedt een paar speciale eigenschappen voor XML-data:

Property Beschrijving
_attributes Alle attributen van het element als een aparte array.
_value De tekstuele inhoud van het element (meestal krijg je deze ook via {$element})
_name De naam van het element, bijvoorbeeld "product"

In de praktijk heb je deze eigenschappen zelden nodig. Attributen en waarden kun je meestal direct uitlezen zoals hierboven beschreven.