PHP ja XML-tiedosto, new DOMDocument('1.0','UTF-8') ja createElement() funktiot

Paluu PHP-oppaan taulukkoon

Rakenteilla - tähän sijoittuu navi

XML-tiedosto ja niiden käyttäminen

Tutustu aluksi linkistä Microsoft-sivulla XM-koodauksen perusteisiin.

XML-tiedoston nimen pääte on xml (esimerkiksi luettelo.xml) ja XML-tiedosto voidaan luoda esimerkiksi Windows Muistio, Linux Kate Notepad++, Visual Code Studio. Luodessa ja tallentaessa xml-tiedosto on oltava valittuna all files.

XML-koodauksen alkeita:

XML-tiedoston sisällön voi myös kirjoittaa elementeineen valmiiksi, tämä on hyvä tapa hahmottaa tiedoston rakenne

Elementtien nimet kannattaa valita kuvaamaan xml-tiedostoon tallennettavia asioita.
Muista! Ä, Ö ja Å kirjaimien käyttäminen elementtien nimissä saattaa aiheuttaa ongelmia !

Sisimpiä elementtejä voi kutsua objekteiksi joilla on arvo, arvo voi olla numero tai merkkijono.

Kohdassa XML-tiedoston luominen, luodaan autot.xml tiedosto johon voidaan tallentaa tietoja useista autoista, ylimmän tason elementin nimi on autot. Seuraavan tason elementin nimi on merkki, jolloin tiedosto voi sisältää useita auto-merkkejä ja usean nimisiä autoja sekä näiden malleja.

XML-tiedoston luominen

Halutaan totettaa autot.xml niminen XML-tiedosto:

    <?xml version="1.0" encoding="UTF-8"?>
    <autot>
      <merkki id="1">
        <nimi> Skoda </nimi>
        <malli> Octavia </malli>
        <kori> sedan </kori>
      </merkki>
    </autot>
	

Tee aluksi teksti-editorissa tyhjä tiedosto ja nimeä se autot.xml nimiseksi.

Koodaus jolla toteutetaan autot.xml tiedoston sisältö:

    <?php
      $dom = new DOMDocument('1.0','UTF-8');
      $dom->formatOutput = true;

      $root = $dom->createElement('autot');
      $dom->appendChild($root);

      $merkki = $dom->createElement('merkki');
      $root->appendChild($result);

      $merkki->setAttribute('id', 1);
      $merkki->appendChild( $dom->createElement('nimi', 'Skoda') );
      $merkki->appendChild( $dom->createElement('malli', 'Octavia') );
      $merkki->appendChild( $dom->createElement('kori', 'sedan') );

      echo '<xmp>'. $dom->saveXML() .'</xmp>';
      $dom->save('autot.xml') or die('XML Create Error');
    ?>
    

Olemassa olevan XML-tiedoston näyttäminen internet-sivulle

XML-tiedoston henkilo.xml koodaus:
    <?xml version="1.0" encoding="UTF-8"?>
     <henkilo status = "ok">
        <opiskelija henk_no = "11">
          <nimi>Anttonen Antti</nimi>
          <luokka>G-404</luokka>
        <opiskelija>
        <opiskelija henk_no = "12">
          <nimi>Virtanen Ville</nimi>
          <luokka>E-512</luokka>
        </opiskelija>
     </henkilo>
     
PHP-koodaus jolla näytetään xml-tiedoston kaikki tiedot:
	 <div class="vari"> 
    <?php
     $xml = simplexml_load_file('http://tietokanta.dy.fi/ohjelmointi/........./henkilo.xml');
     echo '<h3>Henkilö listaus</h3>';
     $lista = $xml->opiskelija;

     for ($i = 0; $i < count($lista); $i++) {
       echo '<b>Henkilo no:</b> ' . $lista[$i]->attributes()->henk_no . '<br>';
       echo 'Nimi: ' . $lista[$i]->nimi . '<br>';
       echo 'Luokka: ' . $lista[$i]->luokka . '<br><br>';
     }
    ?>
    </div>
	

Esimerkki näyttää www-sivulla:

Henkilö listaus

Henkilö no: 11
Nimi: Anttonen Antti
Luokka: G-404

Henkilö no: 12
Nimi: Virtanen Ville
Luokka: E-512

Tämä esimerkki sivu hakee xml-tiedoston palvelimelta jolloin tiedoston osoite täytyy olla tiedoston www-osoite.
Jos xml-tiedosto käsitellään php-koodauksella joka siirtää xml-tiedot esimerkiksi muuttujilla, xml-tiedoston osoitteeksi riittää tiedoston nimi.

simplexml_load_file() ja var_dump()

Esimerkeissä käytettävä kirjasto.xml niminen XML-tiedosto:

    <?xml version="1.0" encoding="UTF-8"?>
    <kirjasto>
      <kirja>
        <nimi> Hopeisen hummerihaarukan tapaus </nimi>
        <kirjoitttaja tyyli="rikos"> Alan Bradley </kirjoittaja>
        <tiedot> Hurmaava yksitoistavuotias harrastelijasalapoliisi Flavia de Luce uskaltautuu kylän markkinoilla 
		           mustalaisnaisen telttaan ja järkyttyy kuulemastaan ennustuksesta pahanpäiväisesti.  </tiedot>
      </kirja>
      <kirja>
        <nimi> Kyberias </nimi>
        <kirjoitttaja tyyli="scifi">  Stanislaw Lem </kirjoittaja>
        <tiedot> Kyberiaksen utopistinen maailma robotteineen ja huimine keksintöineen muistuttaa oudolla tavalla omaamme 
	               – sen ihmisiä ja instituutioita. </tiedot>
      </kirja>
      <kirja>
        <nimi> PATRIARKKOJA JA OLIGARKKEJA </nimi>
        <kirjoitttaja tyyli="elämänkerta">  Rene Nyberg </kirjoittaja>
        <tiedot> Pitkän diplomaattiuran tehneen Venäjän-tuntijan esseekirja kertoo Suomen ja Venäjän lähihistoriasta, 
	               mutta valaisee myös Neuvostoliiton todellisuutta </tiedot>
      </kirja>
     </kirjasto>
	

Ladataan kirjasto.xml niminen XML-tiedosto kirjat-muuttujaan ja näytetään sen sisältö var_dup() -funktiolla:

	<div class="vari">
	<?php 
	  $kirjat = simplexml_load_file('http://tietokanta.dy.fi/ohjelmointi/uusi_opiPHP/......../kirjasto.xml');
	  var_dump($kirjat);
	?>
	</div>
	

Tulos www-sivulla:

object(SimpleXMLElement)#4 (1) { ["kirja"]=> array(3) { [0]=> object(SimpleXMLElement)#5 (3) { ["nimi"]=> string(34) " Hopeisen hummerihaarukan tapaus " ["kirjoittaja"]=> string(14) " Alan Bradley " ["tiedot"]=> string(198) " Hurmaava yksitoistavuotias harrastelijasalapoliisi Flavia de Luce uskaltautuu kylän markkinoilla mustalaisnaisen telttaan ja järkyttyy kuulemastaan ennustuksesta pahanpäiväisesti. " } [1]=> object(SimpleXMLElement)#6 (3) { ["nimi"]=> string(10) " Kyberias " ["kirjoittaja"]=> string(15) " Stanislaw Lem " ["tiedot"]=> string(156) " Kyberiaksen utopistinen maailma robotteineen ja huimine keksintöineen muistuttaa oudolla tavalla omaamme – sen ihmisiä ja instituutioita. " } [2]=> object(SimpleXMLElement)#7 (3) { ["nimi"]=> string(29) " PATRIARKKOJA JA OLIGARKKEJA " ["kirjoittaja"]=> string(13) " Rene Nyberg " ["tiedot"]=> string(171) " Pitkän diplomaattiuran tehneen Venäjän-tuntijan esseekirja kertoo Suomen ja Venäjän lähihistoriasta, mutta valaisee myös Neuvostoliiton todellisuutta " } } }

Edellä tulee testatuksi onko xml-tiedosto kirjoitettu oikein, mikäli ei ole koodaus antaa ilmoituksen false-ilmoituksen.

asXML()

Paremmin muotoillun tulosteen xml-tiedoston sisällöstä saa asXML() -metodilla.

    <div class="vari">
    <?php 
     $kirjat = simplexml_load_file('http://tietokanta.dy.fi/ohjelmointi/uusi_opiPHP/POISTA/PHP_XML/kirjasto.xml')
	             or die("Virhe: Haluamaasi tiedostoa ei voi avata.");
     echo htmlspecialchars($kirjat->asXML());
    <>
    </div>
	 
<?xml version="1.0" encoding="UTF-8"?> <kirjasto> <kirja> <nimi> Hopeisen hummerihaarukan tapaus </nimi> <kirjoittaja tyyli="rikos"> Alan Bradley </kirjoittaja> <tiedot> Hurmaava yksitoistavuotias harrastelijasalapoliisi Flavia de Luce uskaltautuu kylän markkinoilla mustalaisnaisen telttaan ja järkyttyy kuulemastaan ennustuksesta pahanpäiväisesti. </tiedot> </kirja> <kirja> <nimi> Kyberias </nimi> <kirjoittaja tyyli="scifi"> Stanislaw Lem </kirjoittaja> <tiedot> Kyberiaksen utopistinen maailma robotteineen ja huimine keksintöineen muistuttaa oudolla tavalla omaamme – sen ihmisiä ja instituutioita. </tiedot> </kirja> <kirja> <nimi> PATRIARKKOJA JA OLIGARKKEJA </nimi> <kirjoittaja tyyli="elämänkerta"> Rene Nyberg </kirjoittaja> <tiedot> Pitkän diplomaattiuran tehneen Venäjän-tuntijan esseekirja kertoo Suomen ja Venäjän lähihistoriasta, mutta valaisee myös Neuvostoliiton todellisuutta </tiedot> </kirja> </kirjasto>

xpath()

Haluttaessa xml-tiedoston sisällöstä esittää kaikki kirjailijat tulosteen saa xpath()-metodilla:

Alan Bradley
Stanislaw Lem
Rene Nyberg

Esimerkin koodaus:

   <?php
    $tiedot = simplexml_load_file('http://tietokanta.dy.fi/ohjelmointi/uusi_opiPHP/POISTA/PHP_XML/kirjasto.xml');
    $kirjailijat = $tiedot->xpath("/kirjasto/kirja/kirjoittaja");
    foreach($kirjailijat AS $kirjoittaja){
      echo $kirjoittaja . "<br/>";
    }
   ?>
	

Esimerkkejä ja tehtäviä

1. Esimerkki, PHP-tiedosto joka kirjoittaa tekstinkäsittely-ohjelmalla luotuun kirjoitus.xml tiedostoon sisällön.

  <?php
    $writer = new XMLWriter();
    $writer->openUri('kirjoitus.xml');

    $writer->setIndentString('  ');
    $writer->setIndent(true);

    $writer->startDocument( '1.0', 'UTF-8' );
    $writer->startElement('Opiskelija');

    $writer->startElement('Opinnot');
    $writer->writeAttribute('id', '1');

    $writer->writeElement('nimi', 'Arto Aurajuusto');
    $writer->writeElement('Fysiikka', '8.1');
    $writer->writeElement('Kemia', '8.4');
    $writer->endElement();   /*tekee </Opinnot> */

    $writer->flush();
    $writer->endElement();  /*tekee </Opiskelija> */
    $writer->endDocument();
  ?>
  

1. TEHTÄVÄ. Testaa yllä olevan esimerkki 1 koodauksen toimivuus, kopioi koodaus yksinkertaisen html-koodauksen sisällösi ja tallenna php-tiedostoksi. Avaa www-palvelimelta ja tarkista XML-tiedoston sisältö. Muuta koodauksen sisältöä lisäämällä siihen Matematiikka, Ruotsi ja Englanti sekä edellisille kuvitteelliset pisteet. Tarkista tulos.

2. Esimerkki, juomat.xml-tiedoston koodi:

 <?xml version="1.0" encoding="UTF-8"?>
 <juomat>
   <cola> sokeriton </cola>
   <mehu> appelsiini </mehu>
   <tee> minttu </tee>
   <kahvi> mokka </kahvi>
 </juomat>
 

Huomaa. Koodauksen alussa kerrotaan XML-versio ja valittu koodaukseksi UTF-8, joka kertoo koodauksessa mahdollisesti sisältävän skandinaavisia kirjaimia.

2. Tehtävä. Tallenna tyhjä juomat.xml tiedosto. Kopioi tehtävän 1 koodaus ja talleta se juomat.php nimiseksi. Muokkaa juomat.php kirjoittamaan 2.esimerkin mukainen sisältö tyhjään xml-tiedostoon. Tarkista tulos.

Atribuutti

3. Esimerkki, atribuuttina liittymispäivämäärä:

<?xml version="1.0" encoding="UTF-8"?>
<lista liittynyt="1/04/2026">
  <etunimi> Veijo </etunimi>
  <sukunimi> Vikkelä </sukunimi>
</lista>
 

4. Esimerkki:

<?xml version="1.0" encoding="UTF-8"?>
<lista>
  <liittynyt> "2026-9-12" </liittynyt>
   <etunimi> Veijo </etunimi>
   <sukunimi> Vikkelä </sukunimi>
</lista>
 

5. Esimerkki, jossa on helpompi muuttaa päivämäärä-tiedot ohjelmallisesti:

<?xml version="1.0" encoding="UTF-8"?>
<lista>
  <liittynyt>
    <paiva> 9 </paiva>
    <kuukausi> 12 </kuukausi>
    <vuosi> 2026 </vuosi>
  </liittynyt>
  <etunimi> Veijo <
  <sukunimi> Vikkelä </sukunimi>
</lista>
 

6.Esimerkki, kaksi atribuuttia, viesti&vastaus:

<viesti>
  <tunniste id="501">
    <kuka> Tove</kuka>
    <kenelle> Jani </kenelle>
    <otsikko> Muista </otsikko>
    <teksti> Kokous tänään klo 12.30! </teksti>
  </tunniste>
  <tunniste id="502">
    <kuka> Jani </kuka>
    <kenelle> Tove </kenelle>
    <otsikko> Re: Muista
    <teksti> Tulen paikalle. </teksti>
  </tunniste>
</viesti
 

Tehtävä 3. Toteuta internet-sivulla oleva PHP-lomake jolla voidaan kirjoittaa XML-tiedostoon.

Tehtävä 4. Toteuta PHP-lomake jolla voi toistuvasti kirjoittaa tietoja XML-tiedostoon, siten että uusi tieto lisätään edellisen jälkeen ja yksilöidään ID-koodilla.

Tehtävä 5. Toteuta koodaus jolla lomakkella annetun ID-koodin avulla haetaan ja näytetään XML-tiedostosta tietoa.

Tehtävä 6. Toteuta koodaus millä näytetään useita ID-koodin omaavia tietoja eli XML-tiedoston kokonaisuudessaan.