PHP Doku:: Einfache Anwendung - simplexml.examples-basic.html

Verlauf / Chronik / History: (4) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzXML-ManipulationSimpleXMLBeispieleEinfache Anwendung

Ein Service von Reinhard Neidl - Webprogrammierung.

Beispiele

<<Beispiele

Behandlung von XML-Fehlern>>

Einfache Anwendung

Viele Beispiele in dieser Referenz benötigen einen XML-String. Anstatt diesen String in jedem Beispiel zu wiederholen, haben wir ihn als File abgelegt, das wir in den Beispielen inkludieren. Diese eingebundene Datei zeigen wir Ihnen im folgenden Beispiel. Alternativ dazu können Sie ein XML-Dokument erstellen und es mit simplexml_load_file() einlesen.

Beispiel #1 Einzubindende Datei example.php mit XML-String

<?php
$xmlstr 
= <<<XML
<?xml version='1.0' standalone='yes'?>
<movies>
 <movie>
  <title>PHP: Behind the Parser</title>
  <characters>
   <character>
    <name>Ms. Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Act&#211;r</actor>
   </character>
  </characters>
  <plot>
   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.
  </plot>
  <great-lines>
   <line>PHP solves all my web problems</line>
  </great-lines>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
 </movie>
</movies>
XML;
?>

Die Einfachheit von SimpleXML ist besonders deutlich erkennbar, wenn man einen String oder eine Zahl aus einem XML Dokument extrahieren will.

Beispiel #2 <plot> ermitteln

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

echo 
$xml->movie[0]->plot// "So this language. It's like..."
?>

Um auf Elemente in einem XML-Dokument zuzugreifen, die Zeichen enthalten, die nicht dem PHP-Benennungsstandard entsprechen (z.B. der Bindestrich), können Sie den Elementnamen zwischen geschweifte Klammern und einfachen Anführungszeichen einschließen.

Beispiel #3 Auf <line> zugreifen

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

echo 
$xml->movie->{'great-lines'}->line// "PHP solves all my web problems"
?>

Beispiel #4 Auf nicht-eindeutige Elemente per SimpleXML zugreifen

Existieren mehrere Instanzen eines Elements als Kinder eines einzigen Elternelements, lassen sich normale iterative Techniken einsetzen.

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

/* Für jeden <movie> Knoten geben wir ein separates <plot> aus. */
foreach ($xml->movie as $movie) {
   echo 
$movie->plot'<br />';
}

?>

Beispiel #5 Attribute verwenden

Bis jetzt haben wir nur das Auslesen von Elementnamen und ihrer Werte betrachtet. SimpleXML kann aber auch auf die Attribute eines Elements zugreifen. Der Zugriff auf die Attribute eines Elements funktioniert genauso, als würden Sie die Elemente eines Array ansprechen.

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

/* Zugriff auf die <rating> Knoten des ersten Films
 * Die Bewertungsskala wird zusätzlich ausgegeben. */
foreach ($xml->movie[0]->rating as $rating) {
    switch((string) 
$rating['type']) { // Verwende Attribute als Element-Indizes
    
case 'thumbs':
        echo 
$rating' thumbs up';
        break;
    case 
'stars':
        echo 
$rating' stars';
        break;
    }
}
?>

Beispiel #6 Vergleichen von Elementen und Attributen mit Text

Um ein Element oder ein Attribut mit einem String zu vergleichen oder an eine Funktion zu übergeben, die einen String als Parameter benötigt, müssen Sie das Element respektive das Attribut in einen String casten. Verwenden Sie dafür (string), ansonsten behandelt PHP das Element als Objekt.

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

if ((string) 
$xml->movie->title == 'PHP: Behind the Parser') {
    print 
'Mein Lieblingsfilm.';
}

htmlentities((string) $xml->movie->title);
?>

Beispiel #7 Zwei Elemente vergleichen

Zwei SimpleXMLElements können ab PHP 5.2.0 auch dann als unterschiedlich betrachtet werden, wenn sie auf das gleiche Element zeigen.

<?php
$el1 
= new SimpleXMLElement($xmlstr);
$el2 = new SimpleXMLElement($xmlstr);
var_dump($el1 == $el2); // false ab PHP 5.2.0
?>

Beispiel #8 XPath verwenden

SimpleXML verfügt über einen eingebauten XPath-Support. So finden Sie alle <character> Elemente:

<?php
include 'example.php';
$xml = new SimpleXMLElement($xmlstr);

foreach (
$xml->xpath('//character') as $character) {
    echo 
$character->name'gespielt von '$character->actor'<br />';
}
?>

'//' wird hier als Wildcard verwendet. Um absolute Pfadangaben zu verwenden, lassen Sie einen der Slashe weg.

Beispiel #9 Werte setzen

Die Daten in SimpleXML müssen nicht konstant sein. Das Objekt erlaubt die Veränderung all seiner Elemente.

<?php
include 'example.php';
$xml = new SimpleXMLElement($xmlstr);

$xml->movie[0]->characters->character[0]->name 'Miss Coder';

echo 
$xml->asXML();
?>

Der vorstehende Code erzeugt ein neues XML-Dokument gleich dem Original, mit der Ausnahme, dass das neue XML von Ms. Coder auf Miss Coder verändert wurde.

Beispiel #10 Elemente und Attribute hinzufügen

Seit PHP 5.1.3 verfügt SimpleXML über eine vereinfachte Möglichkeit, Kindelemente und Attribute hinzuzufügen.

<?php
include 'example.php';
$xml = new SimpleXMLElement($xmlstr);

$character $xml->movie[0]->characters->addChild('character');
$character->addChild('name''Mr. Parser');
$character->addChild('actor''John Doe');

$rating $xml->movie[0]->addChild('rating''PG');
$rating->addAttribute('type''mpaa');

echo 
$xml->asXML();
?>

Die obige Code gibt ein XML-Dokument aus, das auf dem Original basiert, aber einen neuen Charakter und ein weiteres Rating enthält.

Beispiel #11 DOM Interoperabilität

PHP hat einen Mechanismus, um XML-Knoten zwischen dem SimpleXML und dem DOM Format zu konvertieren. Das Beispiel zeigt, wie man ein DOM Element in SimpleXML verwandelt.

<?php
$dom 
= new domDocument;
$dom->loadXML('<books><book><title>blah</title></book></books>');
if (!
$dom) {
     echo 
'Fehler beim Parsen des Dokuments';
     exit;
}

$s simplexml_import_dom($dom);

echo 
$s->book[0]->title;
?>


5 BenutzerBeiträge:
- Beiträge aktualisieren...
Max K.
20.06.2010 23:38
From the README file:

SimpleXML is meant to be an easy way to access XML data.

SimpleXML objects follow four basic rules:

1) properties denote element iterators
2) numeric indices denote elements
3) non numeric indices denote attributes
4) string conversion allows to access TEXT data

When iterating properties then the extension always iterates over
all nodes with that element name. Thus method children() must be
called to iterate over subnodes. But also doing the following:
foreach ($obj->node_name as $elem) {
  // do something with $elem
}
always results in iteration of 'node_name' elements. So no further
check is needed to distinguish the number of nodes of that type.

When an elements TEXT data is being accessed through a property
then the result does not include the TEXT data of subelements.

Known issues
============

Due to engine problems it is currently not possible to access
a subelement by index 0: $object->property[0].
ie dot raymond at gmail dot com
2.04.2010 1:07
If you need to output valid xml in your response, don't forget to set your header content type to xml in addition to echoing out the result of asXML():

<?php

$xml
=simplexml_load_file('...');
...
...
xml stuff
...

//output xml in your response:
header('Content-Type: text/xml');
echo
$xml->asXML();
?>
php at keith tyler dot com
23.12.2009 21:57
[Editor's Note: The SimpleXMLIterator class, however, does implement these methods.]

While SimpleXMLElement claims to be iterable, it does not seem to implement the standard Iterator interface functions like ::next and ::reset properly. Therefore while foreach() works, functions like next(), current(), or each() don't seem to work as you would expect -- the pointer never seems to move or keeps getting reset.
bjorn at xQmail dot eu
31.08.2009 16:48
If you're not sure the XML will be valid you'd better use:

<?php
$xmlObject
= simplexml_load_string($xml);
// or
$xmlObject = simplexml_load_file(xml);
?>

Both of these return a SimpleXMLElement Object or a libXMLError Object.
radams at circlepix com
24.04.2009 19:52
To test whether an element exists:

<?php

    $xml
= <<<EOT
<?xml version='1.0' standalone='yes'?>
<root>
    <test1></test1>
    <test2 />
    <test4> </test4>
</root>
EOT;

   
$xmlDoc = new SimpleXMLElement($xml);

echo
"Test1: \n";
var_dump($xmlDoc->test1);
echo
"\n(" . (bool)$xmlDoc->test1 . ")";
echo
"\n\n";

echo
"Test2: \n";
var_dump($xmlDoc->test2);
echo
"\n(" . (bool)$xmlDoc->test2 . ")";
echo
"\n\n";

echo
"Test3: \n";
var_dump($xmlDoc->test3);
echo
"\n(" . (bool)$xmlDoc->test3 . ")";
echo
"\n\n";

echo
"Test4: \n";
var_dump($xmlDoc->test4);
echo
"\n(" . (bool)$xmlDoc->test4 . ")";
echo
"\n\n";

?>

The var_dumps for test1, test2, and test3 are identical, but the (bool) test gives a '1' for test1 and test2, and a '' for test3.



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)