addChild()
Erfahren Sie, wie PHP SimpleXMLElement::addChild() Kindelemente zu einem XML-Dokument hinzufügt – mit Werten, Namespaces, Fallstricken und ausführbaren Beispielen.
Einführung
SimpleXMLElement::addChild() ist die Methode, mit der Sie XML in PHP von Grund auf erstellen, Knoten für Knoten. SimpleXML ist eine integrierte PHP-Erweiterung, die ein XML-Dokument in ein Objekt umwandelt, das Sie mit normaler Eigenschaftssyntax lesen und schreiben können. Während das Lesen so einfach ist wie $xml->book->title, ist das Schreiben eines brandneuen Elements die Aufgabe von addChild().
Diese Seite erklärt, was addChild() zurückgibt und warum das wichtig ist, wie man Werte und Namespaces hinzufügt sowie die Fallstricke, über die man stolpert (Entity-Escaping, Attribute vs. Elemente und die NULL-Wert-Falle). Alle nachfolgenden Beispiele sind ausführbar.
Syntax
public SimpleXMLElement::addChild(
string $qualifiedName,
?string $value = null,
?string $namespace = null
): ?SimpleXMLElement$qualifiedName— der Name (Tag) des neuen Kindelements, z. B."title".$value— optionaler Textinhalt für das Element. Wenn weggelassen odernull, wird ein leeres Element erstellt (<title/>).$namespace— optionale Namespace-URI, zu der das Kindelement gehört.
Der Rückgabewert ist das entscheidende Detail: addChild() gibt das neu erstellte Kindelement zurück, nicht das übergeordnete Element. Dieses zurückgegebene Objekt ist es, auf das Sie weitere Aufrufe verketten, um verschachtelte Strukturen aufzubauen.
Ein einzelnes Kindelement hinzufügen
Dies gibt aus:
<?xml version="1.0"?>
<books><book>PHP Basics</book></books>Wir beginnen mit einem Root-Element <books> und fügen dann ein Kindelement <book> hinzu, dessen Textinhalt PHP Basics ist. asXML() serialisiert das Objekt zurück in einen XML-String.
Eine verschachtelte Struktur aufbauen
Da addChild() das soeben erstellte Kindelement zurückgibt, erfassen Sie diesen Rückgabewert, um weitere Ebenen hinzuzufügen:
<?php
$xml = new SimpleXMLElement('<books></books>');
$book = $xml->addChild('book'); // returns the <book> element
$book->addChild('title', 'PHP Basics'); // adds <title> inside <book>
$book->addChild('author', 'John Doe'); // adds <author> inside <book>
echo $xml->asXML();Ausgabe:
<?xml version="1.0"?>
<books><book><title>PHP Basics</title><author>John Doe</author></book></books>Hätten Sie statt $book->addChild(...) den Aufruf $xml->addChild('title', ...) verwendet, wäre <title> neben <book> gelandet und nicht darin. Das Objekt, auf dem Sie addChild() aufrufen, ist immer das übergeordnete Element.
Kindelemente vs. Attribute
addChild() erstellt nur Elemente. Um ein Attribut hinzuzufügen (z. B. id="1"), verwenden Sie addAttribute() auf demselben Element:
<?php
$xml = new SimpleXMLElement('<books></books>');
$book = $xml->addChild('book');
$book->addAttribute('id', '1');
$book->addChild('title', 'PHP Basics');
echo $xml->asXML();Ausgabe:
<?xml version="1.0"?>
<books><book id="1"><title>PHP Basics</title></book></books>Sonderzeichen: ein echter Fallstrick
Man könnte erwarten, dass addChild() XML-unsichere Zeichen im Wert automatisch escaped. Das tut es nicht vollständig — ein rohes & lässt SimpleXML es als Beginn einer Entity-Referenz behandeln und gibt eine Warnung „unterminated entity reference" aus, wobei der Inhalt verloren geht:
<?php
$xml = new SimpleXMLElement('<docs></docs>');
$xml->addChild('note', 'Tom & Jerry <fun>'); // Warning: unterminated entity reference
echo $xml->asXML();Dies gibt ein leeres Element aus, nicht den gewünschten Text:
<?xml version="1.0"?>
<docs><note/></docs>Der zuverlässige Weg, Text mit &, < oder > zu setzen, ist die Eigenschaftszuweisung, die korrekt escaped:
<?php
$xml = new SimpleXMLElement('<docs></docs>');
$xml->note = 'Tom & Jerry <fun>';
echo $xml->asXML();Ausgabe:
<?xml version="1.0"?>
<docs><note>Tom & Jerry <fun></note></docs>Also: Verwenden Sie addChild() zum Erstellen des Elements, aber weisen Sie nicht vertrauenswürdigen Text mit Sonderzeichen über die Eigenschaft zu (oder escapen Sie ihn vorab mit htmlspecialchars()).
Kindelemente mit Namespaces hinzufügen
Das dritte Argument verknüpft das Kindelement mit einer Namespace-URI:
<?php
$xml = new SimpleXMLElement('<feed xmlns:dc="http://purl.org/dc/elements/1.1/"></feed>');
$xml->addChild('creator', 'Jane Roe', 'http://purl.org/dc/elements/1.1/');
echo $xml->asXML();Ausgabe:
<?xml version="1.0"?>
<feed xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:creator>Jane Roe</dc:creator></feed>Häufige Fallstricke
- Den Rückgabewert beim Verschachteln nicht ignorieren.
addChild()gibt das neue Kindelement zurück; verketten Sie auf diesem, nicht auf dem Root-Element, sonst landen Ihre Elemente auf derselben Ebene. nullvs. leerer string.addChild('tag')undaddChild('tag', null)erstellen beide ein leeres selbstschließendes Element (<tag/>). Übergeben Sie''für einen leeren, aber vorhandenen Textknoten.- Werte werden nicht sicher escaped. Ein rohes
&im Wert löst eine Entity-Referenz-Warnung aus und der Text geht verloren; weisen Sie Sonderzeichen über die Eigenschaft zu ($el->tag = $text;) oder escapen Sie sie vorab. Elementnamen müssen gültige XML-Bezeichner sein. - Es verändert das Objekt direkt.
addChild()ändert das Dokument, das das Objekt kapselt; es gibt keinen separaten „Speichern"-Schritt außer der Serialisierung mitasXML().
Wann man es verwendet
Greifen Sie zu addChild(), wenn Sie XML generieren müssen — beim Erstellen eines RSS/Atom-Feeds, einer Sitemap, einer Konfigurationsdatei oder einer API-Nutzlast — und Sie bereits die leichtgewichtige Objektsyntax von SimpleXML mögen. Zum Parsen von bestehendem XML beginnen Sie typischerweise mit simplexml_load_string() oder simplexml_load_file() und lesen dann mit children(). Für Dokumente, die umfangreiche Bearbeitung erfordern (Verschieben/Entfernen von Knoten), ist die DOM-Erweiterung besser geeignet.
Fazit
SimpleXMLElement::addChild() fügt einem XML-Knoten ein Kindelement hinzu und gibt dieses neue Kindelement zurück, sodass Sie verschachtelte Bäume fließend aufbauen können. Merken Sie sich die Grundlagen: Es gibt das Kindelement zurück, rohe Sonderzeichen im Wert erfordern eine Eigenschaftszuweisung oder vorheriges Escaping, Attribute benötigen addAttribute(), und das optionale dritte Argument platziert das Kindelement in einem Namespace. Unter PHP SimpleXML finden Sie einen umfassenderen Überblick über die Arbeit mit XML in PHP.