1
0
mirror of https://github.com/php/doc-de.git synced 2026-03-24 07:12:15 +01:00
Files
archived-doc-de/reference/simplexml/examples.xml
2026-01-25 14:20:35 +00:00

553 lines
14 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: bdc3ab31fb7db217fe9418230a11d9d779ee65eb Maintainer: sammywg Status: ready -->
<!-- Reviewed: yes -->
<!-- Rev-Revision: a0ae28d3bc85f927c22649ebd9a590b921534b7d Reviewer: samesch -->
<chapter xml:id="simplexml.examples" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
&reftitle.examples;
<section xml:id="simplexml.examples-basic">
<title>Grundlegende Verwendung von SimpleXML</title>
<para>
Viele Beispiele in dieser Referenz benötigen einen XML-String. Anstatt
diesen String in jedem Beispiel zu wiederholen, legen wir ihn in einer
Datei ab, die 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 <function>simplexml_load_file</function>
einlesen.
</para>
<para>
<example>
<title>Einzubindende Datei examples/simplexml-data.php mit XML-String</title>
<programlisting role="php" xml:id="simplexml.examples.movie">
<![CDATA[
<?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;
?>
]]>
</programlisting>
</example>
</para>
<para>
Die Einfachheit von SimpleXML ist besonders deutlich erkennbar, wenn man
einen String oder eine Zahl aus einem XML-Dokument extrahieren will.
<example>
<title><literal>&lt;plot&gt;</literal> ermitteln</title>
<programlisting role="php">
<![CDATA[
<?php
include 'examples/simplexml-data.php';
$movies = new SimpleXMLElement($xmlstr);
echo $movies->movie[0]->plot;
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
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.
]]>
</screen>
</example>
</para>
<para>
Um auf Elemente in einem XML-Dokument zuzugreifen, die Zeichen enthalten,
die nicht dem PHP-Benennungsstandard entsprechen (&zb; der Bindestrich),
können Sie den Elementnamen zwischen geschweifte Klammern und
einfachen Anführungszeichen einschließen.
<example>
<title>Auf <literal>&lt;line&gt;</literal> zugreifen</title>
<programlisting role="php">
<![CDATA[
<?php
include 'examples/simplexml-data.php';
$movies = new SimpleXMLElement($xmlstr);
echo $movies->movie->{'great-lines'}->line;
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
PHP solves all my web problems
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Auf nicht-eindeutige Elemente per SimpleXML zugreifen</title>
<simpara>
Existieren mehrere Instanzen eines Elements als Kinder eines einzigen
Elternelements, lassen sich normale iterative Techniken einsetzen.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'examples/simplexml-data.php';
$movies = new SimpleXMLElement($xmlstr);
/* Für jeden <character>-Knoten geben wir ein separates <name> aus. */
foreach ($movies->movie->characters->character as $character) {
echo $character->name, ' played by ', $character->actor, PHP_EOL;
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Ms. Coder played by Onlivia Actora
Mr. Coder played by El ActÓr
]]>
</screen>
</example>
</para>
<note>
<para>
Eigenschaften (<literal>$movies->movie</literal> im vorherigen Beispiel)
sind keine Arrays. Sie sind
<link linkend="class.iterator">iterierbare</link> und
<link linkend="class.arrayaccess">zugreifbare</link> Objekte.
</para>
</note>
<para>
<example>
<title>Attribute verwenden</title>
<simpara>
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 <type>&array;</type>s
ansprechen.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'examples/simplexml-data.php';
$movies = new SimpleXMLElement($xmlstr);
/* Zugriff auf die <rating>-Knoten des ersten Films
* Die Bewertungsskala wird zusätzlich ausgegeben. */
foreach ($movies->movie[0]->rating as $rating) {
switch((string) $rating['type']) { // Verwende Attribute als Element-Indizes
case 'thumbs':
echo $rating, ' Daumen hoch';
break;
case 'stars':
echo $rating, ' Sterne';
break;
}
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
7 Daumen hoch5 Sterne
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Vergleichen von Elementen und Attributen mit Text</title>
<simpara>
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 <literal>(string)</literal>, ansonsten behandelt PHP
das Element als Objekt.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'examples/simplexml-data.php';
$movies = new SimpleXMLElement($xmlstr);
if ((string) $movies->movie->title == 'PHP: Behind the Parser') {
print 'Mein Lieblingsfilm.';
}
echo htmlentities((string) $movies->movie->title);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
My favorite movie.PHP: Behind the Parser
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Zwei Elemente vergleichen</title>
<simpara>
Zwei SimpleXMLElements können auch dann als unterschiedlich betrachtet
werden, wenn sie auf das gleiche Element zeigen.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'examples/simplexml-data.php';
$movies1 = new SimpleXMLElement($xmlstr);
$movies2 = new SimpleXMLElement($xmlstr);
var_dump($movies1 == $movies2);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
bool(false)
]]>
</screen>
</example>
</para>
<para>
<example>
<title>XPath verwenden</title>
<simpara>
SimpleXML verfügt über eine eingebaute
<acronym>XPath</acronym>-Unterstützung. So können alle
<literal>&lt;character&gt;</literal>-Elemente gefunden werden.
</simpara>
<simpara>
'<literal>//</literal>' wird hier als Wildcard verwendet. Um absolute
Pfadangaben zu verwenden, lassen Sie einen der Schrägstriche weg:
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'examples/simplexml-data.php';
$movies = new SimpleXMLElement($xmlstr);
foreach ($movies->xpath('//character') as $character) {
echo $character->name, ' gespielt von ', $character->actor, PHP_EOL;
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Ms. Coder gespielt von Onlivia Actora
Mr. Coder gespielt von El ActÓr
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Werte setzen</title>
<simpara>
Die Daten in SimpleXML müssen nicht konstant sein. Das Objekt erlaubt
die Veränderung all seiner Elemente.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'examples/simplexml-data.php';
$movies = new SimpleXMLElement($xmlstr);
$movies->movie[0]->characters->character[0]->name = 'Miss Coder';
echo $movies->asXML();
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
<?xml version="1.0" standalone="yes"?>
<movies>
<movie>
<title>PHP: Behind the Parser</title>
<characters>
<character>
<name>Miss Coder</name>
<actor>Onlivia Actora</actor>
</character>
<character>
<name>Mr. Coder</name>
<actor>El Act&#xD3;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>
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Elemente und Attribute hinzufügen</title>
<simpara>
SimpleXML verfügt über eine vereinfachte Möglichkeit, Kindelemente und
Attribute hinzuzufügen.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'examples/simplexml-data.php';
$movies = new SimpleXMLElement($xmlstr);
$character = $movies->movie[0]->characters->addChild('character');
$character->addChild('name', 'Mr. Parser');
$character->addChild('actor', 'John Doe');
$rating = $movies->movie[0]->addChild('rating', 'PG');
$rating->addAttribute('type', 'mpaa');
echo $movies->asXML();
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
<?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&#xD3;r</actor>
</character>
<character><name>Mr. Parser</name><actor>John Doe</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>
<rating type="mpaa">PG</rating></movie>
</movies>
]]>
</screen>
</example>
</para>
<para>
<example>
<title>DOM-Interoperabilität</title>
<simpara>
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.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
$dom = new DOMDocument;
$dom->loadXML('<books><book><title>blah</title></book></books>');
if (!$dom) {
echo 'Fehler beim Parsen des Dokuments';
exit;
}
$books = simplexml_import_dom($dom);
echo $books->book[0]->title;
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
blah
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Verwenden von Namensräumen</title>
<programlisting role="php">
<![CDATA[
<?php
$data = <<<XML
<movies xmlns="http://default" xmlns:a="http://a">
<movie xml:id="movie1" a:link="IMDB">
<a:actor>Onlivia Actora</a:actor>
</movie>
</movies>
XML;
$movies = simplexml_load_string($data);
// Der Namensraum http://www.w3.org/XML/1998/namespace ist als "xml" verfügbar.
echo $movies->movie->attributes("xml", true)["id"] . "\n";
// Auf Attribute mit Namensraum kann mit attributes() zugegriffen werden.
echo $movies->movie->attributes("a", true)["link"] . "\n";
// Durch die Verwendung der Namensraum-URI kann das Dokument jeden beliebigen
// Namensraum-Alias verwenden.
echo $movies->movie->attributes("http://a")["link"] . "\n";
// Auf Kinder kann mit children() zugegriffen werden.
echo $movies->movie->children("http://a")->actor . "\n";
// Um xpath() mit einem Namensraum zu benutzen, muss dieser zuerst registriert
// werden.
$movies->registerXPathNamespace("a", "http://a");
echo count($movies->xpath("//a:actor")) . "\n";
// Auch der Standard-Namensraum muss registriert werden.
$movies->registerXPathNamespace("default", "http://default");
echo count($movies->xpath("//default:movie")) . "\n";
// Dies ist leer.
echo count($movies->xpath("//movie")) . "\n";
?>
]]>
</programlisting>
</example>
</para>
</section>
<section xml:id="simplexml.examples-errors">
<title>Behandlung von XML-Fehlern</title>
<para>
Die Behandlung von XML-Fehlern beim Laden von Dokumenten ist eine sehr
einfache Sache. Durch die Verwendung der
<link linkend="book.libxml">libxml</link>-Funktionalität ist es möglich,
alle XML-Fehlermeldungen beim Laden des Dokuments zu unterdrücken und
danach über die aufgetretenen Meldungen zu iterieren.
</para>
<para>
Das <classname>LibXMLError</classname>-Objekt, das von
<function>libxml_get_errors</function> zurückgegeben wird, hat verschiedene
Eigenschaften. Dazu gehören
<link linkend="libxmlerror.props.message">message</link>,
<link linkend="libxmlerror.props.line">line</link> und
<link linkend="libxmlerror.props.column">column</link> (Position) des
jeweiligen Fehlers.
</para>
<para>
<example>
<title>Laden eines defekten XML-Strings</title>
<programlisting role="php" xml:id="simplexml.examples.error">
<![CDATA[
<?php
libxml_use_internal_errors(true);
$sxe = simplexml_load_string("<?xml version='1.0'><broken><xml></broken>");
if ($sxe === false) {
echo "Laden des XML fehlgeschlagen\n";
foreach(libxml_get_errors() as $error) {
echo "\t", $error->message;
}
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Laden des XML fehlgeschlagen
Blank needed here
parsing XML declaration: '?>' expected
Opening and ending tag mismatch: xml line 1 and broken
Premature end of data in tag broken line 1
]]>
</screen>
</example>
</para>
<section role="seealso"><!-- {{{ -->
&reftitle.seealso;
<para>
<simplelist>
<member><function>libxml_use_internal_errors</function></member>
<member><function>libxml_get_errors</function></member>
<member><xref linkend="class.libxmlerror" /></member>
</simplelist>
</para>
</section>
</section>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->