Generovanie XML pomocou PHP triedy DOMDocument

Published:

Add / read comments

V minulom článku som doloval dáta z jednej stránky a spracovával. Teraz prišiel čas na ich ďalšie využitie. Dáta som si vtedy upravil do podoby dvojrozmerného poľa a z neho teraz potrebujem vytvoriť XML dokument (súbor), ktorý bude mať štruktúru, ktorú potrebujem.

Všetko o triede DOMDocument, ktorú použijem, nájdete na oficiálnych stránkach PHP tuto.

Potreboval som štruktúru, kde bude jeden hlavný koreň (to musí mať každý valídny XML dokument). Koreň bude mať ľubovolný počet detských elementov, ktoré predstavujú štáty. A každý tento element bude mať presne definovaný počet elementov, ktoré predstavujú údaje o danom štáte (populácia, rozloha, medzinárodný kód). Najprv je potrebné inicializovať objekt triedy DOMDocument a nastaviť nejaké parametre nasledujúco:

$doc = new DOMDocument('1.0', 'utf-8');
//pekny strukturovany vystup
$doc->formatOutput = true;

Tak, objekt máme a teraz môžeme začať vytvárať XML súbor. Začneme tvorbou koreňového elementu:

//vytvorim korenovy element
$root = $doc->createElement( "states" );
//a pripojim ho do XML suboru
$doc->appendChild( $root );

Čiže to jednoduchšie máme za sebou, teraz musíme prejsť celé pole a potrebné údaje dynamicky počas tohto výletu polom zapísať do XML súboru v podobe detských elementov koreňového elementu. Kód je komentovaný, preto by mal byť samovysvetlujúci:

//prechadzam cele dvojrozmerne pole
for($i=2; $i<count($cells); $i++)
{
  //vytvorim element "state"
  $state = $doc->createElement( "state" );

  for($j=0; $j<count($cells[$i]); $j++)
  {
    // nazov statu je treti v poradi
    if($j==3){
      //vytvorim element "name"
      $state_name = $doc->createElement( "name" );

      //donho ako decko prilepim textovy element obsahujuci hodnotu z pola
      $state_name->appendChild(	$doc->createTextNode( $cells[$i][$j] ) 	);

      //element "name" prilepim ako decko do elementu "state"
      $state->appendChild( $state_name );
    }			     
    // kod statu je stvrty v poradi

    if($j==4){
      //vytvorim element "code"
      $state_code = $doc->createElement( "code" );

      //donho ako decko prilepim textovy element obsahujuci hodnotu z pola
      $state_code->appendChild( $doc->createTextNode( $cells[$i][$j] ) );

      //element "code" prilepim ako decko do elementu "state"
      $state->appendChild( $state_code );
    }			     
    // rozloha statu je piata v poradi

    if($j==5){
      //vytvorim element "area"
      $state_area = $doc->createElement( "area" );

      //donho ako decko prilepim textovy element obsahujuci hodnotu z pola
      $state_area->appendChild(	$doc->createTextNode( $cells[$i][$j] )	);

      //element "area" prilepim ako decko do elementu "state"
      $state->appendChild( $state_area );
    } 			     
    // populacia statu je siedma v poradi

    if($j==7){
      //vytvorim element "population"
      $state_population = $doc->createElement( "population" );

      //donho ako decko prilepim textovy element obsahujuci hodnotu z pola
      $state_population->appendChild(
      $doc->createTextNode( $cells[$i][$j] ) );

      //element "population" prilepim ako decko do elementu "state"
      $state->appendChild( $state_population );
    }			     			
  }      
  //pripojim element "state" ako detsky element korenoveho elementu "states"
  $root->appendChild( $state );
}

Tak a je to! Teraz mám v objekte "$doc" vytvorený XML súbor, ktorý je ale potrebné niekam zapísať, aby sme oňho neprišli.

//vrati obsah objektu (XML strom) do premennej v podobe retazca 
$xml_string = $doc->saveXML(); //link: http://sk2.php.net/manual/en/domdocument.savexml.php
//otvori subor na zapis
$handle = fopen("states.xml", "w");
//zapise do suboru
fwrite($handle, $xml_string);
//zatvori subor
fclose($handle);

Čiže sme získali XML súbor, v ktorom máme dáta v želanej štruktúre. Celý kód z tohto, aj predchádzajúceho článku, si môžete aj stiahnuť a otestovať sami.

Published:

Add / read comments

FIND ME

Share, follow or connect with me.