logo   XML - Export.




Nederst på denne side kan ses en simpel kode til etablering af en RSS-fil.


Koden kan opdeles i forskellige komponenter:




DOMDocument()


$dom = new DOMDocument('1.0', 'utf-8');

Anvendes som den første kodelinie til at etablere en instans af DOMDocument()-klassen. De viste parametre skal anvendes. I stedet for $dom kan benyttes et hvilketsomhelst andes gyldigt variabel navn.




Rod - niveau 0


Yderst omkring alle XML-filer skal 'roden' placeres som en container. Den kan også betragtes som 'niveau 0', da den ikke indeholder egentlige data.


Roden består af følgende kode:


//indsæt rod
$rss = $dom->createElement('rss');
$rss->setAttribute('version', '2.0'); //optionel
$dom->appendChild($rss);


  • $dom ..
    Opretter en ny instans af DOMDocument() objektet med angivelse af versions nr. (skal være 1.0) og anvendt karaktersæt.
  • $rss = $dom ..
    Opretter starttag til rod-elementet 'rss' med $dom
  • $rss->setAttribute ..
    Indsætter attribut-tag i 'rss' angivelse af benyttet rss version.
  • $dom->appendChild ..
    Opretter sluttag til rss-elementet og knytter $rss til $dom.




Den kode der anvendes til opbygning af en XML-fil kan opdeles i et antal komponenter:


createElement() og appendChild()
Selvom en XML-fil visuelt oftest fremstår som en hierarkisk opbygget konstruktion er den i datamæssig sammenhæng en lang sammenhængende streng med de enkelte tags liggende i forlængelse af hinanden som ved konkatenering.
createElement()
Funktionen createElement() etablerer et starttag for de enkelte elementer.
appendChild()
Funktionen appendChild() etablerer en sluttag for de enkelte elementer.

I et databærende tag (herefter kaldet 'datatag') anvendes de indlejrede i hinanden:
$channel -> appendChild ($dom -> createElement('title', $row_chan['category_title']));

I et tag med indlejrede elementer anvendes de hver for sig:
$item = $dom -> createElement ('item');
   $item -> appendChild ($dom -> createElement('title', $row_item['news_title']));
   $newslink = '<![CDATA[' . $newslink0 . "&category_id=" . $category_id . "&news_id=" . $row_item["news_id"] . ']]>';
   $item -> appendChild ($dom -> createElement('link',$newslink ));
   $item -> appendChild ($dom -> createElement('description', $row_item['news_content']));
$channel -> appendChild ($item);




DOMDocument()


DOMDocument() er den standard PHP-funktion, der indeholder den fornødne funktionalitet til at opbygge xml-filer. Hver gang $dom efterfølgende anvendes i koden betyder det: 'Brug DOMDocument() til at udføre den pågældende opgave'.
I stedet for $dom kan benyttes et hvilketsomhelst andes gyldigt variabel navn.




Rod (niveau 0)


Yderst omkring alle XML-filer ligger 'roden' som en container. Den kan også betragtes som 'niveau 0', da den ikke indeholder egentlige data.


Roden består af følgende kode:


$dom = new DOMDocument('1.0', 'utf-8');
dom_id = new DOMDocument('1.0', 'utf-8');
    //indsæt 'rss'
    $rss = $dom->createElement('rss');
    $rss->setAttribute('version', '2.0'); //optionel
    $dom->appendChild($rss);
$niveau0_id = $dom->createElement('niveau0_id');
$dom-id ->appendChild($niveau0-id);


  • $dom ..
    Opretter en ny instans af DOMDocument() objektet med angivelse af versions nr. (skal være 1.0) og anvendt karaktersæt.
  • $rss = $dom ..
    Opretter starttag til rod-elementet 'rss' med $dom
  • $rss->setAttribute ..
    Indsætter attribut-tag i 'rss' angivelse af benyttet rss version.
  • $dom->appendChild ..
    Opretter sluttag til rss-elementet og knytter $rss til $dom.




Elementer (niveau 1-x)


Efter roden indsættes de i situationen relevante:

  • data elementer
  • $niveau_id -> appendChild ($dom_id -> createElement('title', $row_chan['category_title']));

  • niveau elementer
    Definition af ny indlejring (niveau) og tilknytning af denne til aktuelt niveau.
  • $niveau+1_id = $dom_id -> createElement ('niveau+1_id');
    .
    her indsættes indlejrede data- og evt. niveauelementer på næste niveau.
    .
    $niveau_id -> appendChild ($niveau+1_id);


Alle data- og niveau- elementer på samme niveau skal have samme ident.


Ofte vil der i XML-filer være situationer hvr det samme data- eller niveau-element med de samme to eller flere dataelementer indlejrede forekommer flere gange efter hinanden. Disse situationer løses ved indsættelse med 'while'-løkker.




Afslutning



$dom -> formatOutput = true;
$dom -> save($stifil);
$dom_id -> formatOutput = true;
$dom_id -> save($stifil);





Kode


Nedenfor er vist koden til opbygning af en RSS-fil. Den medtager kun de obligatoriske tags. Princippet vil være det samme for en XML-fil - blot vil tag-navnene være valgfrie.


Koden har været anvendt som include i flere programmer til vedligehold af et nyhedssite.


Includen har typisk været placeret lige efter opdatering af database:

$query = "
UPDATE news SET
.
.
if ($result)
{
   include ('page_functions/generer_rss.php');
   $_SESSION['message'] .= 'Nyheden blev opdateret<br />';
   die(header('location: index.php?page=news&category_id='.$category_id));
}


Den includede kode:


<?php
$query_chan = "select * from categories where category_id = $category_id";
$result_chan = mysqli_query($database_link, $query_chan) or die(mysqli_error($database_link));
$row_chan = mysqli_fetch_assoc ($result_chan);
$antal_chan = mysqli_num_rows ($result_chan);

$query_item = "select * from news where fk_categories_id = $category_id";
$result_item = mysqli_query($database_link, $query_item) or die(mysqli_error($database_link));
$antal_item = mysqli_num_rows ($result_item);

$query_link = "select * from rsslinks limit 1";
$result_link = mysqli_query($database_link, $query_link) or die(mysqli_error($database_link));
$row_link = mysqli_fetch_assoc ($result_link);
$antal_link = mysqli_num_rows ($result_link);

$catlink0 = $row_link['rsslink_cat'];
$catlink = $catlink0 . "<![CDATA[&category_id=]]>" . $category_id;

$newslink0 = $row_link['rsslink_news'];

$cat = strtolower($row_chan['category_title']);
$stifil = "../".$cat.".xml";

if($antal_item > 0)
{
$dom = new DOMDocument('1.0', 'utf-8');
    //indsæt rod
    $rss = $dom->createElement('rss');
    $rss->setAttribute('version', '2.0');
    $dom->appendChild($rss);
       //indsæt 'channel'
       $channel = $dom -> createElement ('channel');
       $channel -> appendChild ($dom -> createElement('title', $row_chan['category_title']));

       $channel -> appendChild ($dom -> createElement('link',$catlink));

       $channel -> appendChild ($dom -> createElement('description', $row_chan['category_description']));
       // Indsææt item
       while($row_item = mysqli_fetch_assoc ($result_item))
       {
          $item = $dom -> createElement ('item');
          $item -> appendChild ($dom -> createElement('title', $row_item['news_title']));

          $newslink = '<![CDATA[' . $newslink0 . "&category_id=" . $category_id . "&news_id=" . $row_item["news_id"] . ']]>';
          $item -> appendChild ($dom -> createElement('link',$newslink ));

          $item -> appendChild ($dom -> createElement('description', $row_item['news_content']));
          $channel -> appendChild ($item);
       }
// slut item
       $rss -> appendChild ($channel);
// slut channel

// afslutning
$dom -> formatOutput = true;
$dom -> save($stifil);
} // if(antal_item > 0) slut
?>
   




XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx

Til opbygning af en XML-fil baseret på data fra databasetabeller anvendes funktionen:


DOMDocument() x


Til opbygningen af en XML-fil med DOMDocument anvendes forskellige datastrenge, men især container start / slut og datatag:


  • Den første linie
    $dom = new DOMDocument('1.0', 'utf-8');
    Initierer DOMDocument funktionen og opbygger den første linie i en XML-fil. Bør af "standardiseringshensyn" knyttes til variabelnavnet "$dom". Der skal ikke være nogen sluttag for "$dom".
    Som parametre anføres den XML-version filen skal overholde, samt det karaktersæt der skal anvendes.


    $dom danner filens dokumentations-/start linie. Anvendes endvidere som "niveau 0" under opbygningen af XML-dokumentet : som fast referencepunkt ved "container start" og som parent ved "container slut" for niveau 1.

  • Container tag start
    $tagnavn = $dom -> createElement ('tagnavn');
    Tager altid udgangspunkt i "$dom". Skal placeres der hvor tagget skal begynde i filen.
    Niveau 1 i en XML-fil skal altid være en container med starttag som filens linie 2 og sluttag som filens sidste linie..

  • Container tag slut
    $parent tag -> appendChild ($tagnavn);
    Nu sættes tagget (også start-delen) helt på plads ved at angive, hvilket parent-tag det skal være knyttet til.
    Container tags, der kun indeholder container tags, skal have sluttagget indsat imiddelbart efter starttagget - før definition af de indlejrede container tags kan påbegyndes.
    Container tags, der indeholder data tags, skal afsluttes, når indsættelsen af data tags er afsluttet.

  • Data tag
    $parent tag -> appendChild ($dom -> createElement('tagnavn', 'værdi')); eller
    $parent tag -> appendChild ($dom -> createElement('tagnavn', $row['feltnavn']));
    Data-taggene knyttes til den container, de er indlejret i. Deres eget navn anføres som parameter til 'createElement'.

  • Formatering og gemning For at gøre koden mere læsbar ved visning kan den formateres med 'formatOutput'-funktionen. Ellers bliver den vist som en minified streng.
    Filen kan gemmes på rette sted med 'save'-funktionen. Save indeholder samtidig funktionalitet til at slette en fil, der allerede måtte ligge det pågældende sted.
    $dom -> formatOutput = true;
    $dom -> save('sti og filnavn.xml');

  • Parametre
    Under opbygningen af en XML-fil kan anvendes ca. 15-20 parametre. De placeres på deres egen linie lige efter den tag linie de relatrerer sig til f.eks:
    $relaterer tag->setAttribute('version', '2.0');






















x
x