W3docs

attributes()

XML-Attribute mit PHP SimpleXML lesen, iterieren, ändern, hinzufügen und entfernen — inkl. der Methode attributes() und Namespace-Attributen.

Einführung

In XML ist ein Attribut ein Name/Wert-Paar, das am öffnenden Tag eines Elements steht, etwa isbn in <book isbn="123456789">. PHP SimpleXML stellt diese Attribute über eine kleine, array-ähnliche API bereit, sodass Sie sie lesen, ändern, hinzufügen und entfernen können, ohne das XML manuell zu parsen.

Diese Seite behandelt vier alltägliche Aufgaben — das Lesen eines einzelnen Attributs, das Iterieren über alle Attribute mit attributes(), das Ändern von Werten sowie das Hinzufügen neuer Attribute — und zwei häufige Stolpersteine: Typ-Casting und Namespace-Attribute.

Ein einzelnes Attribut lesen

Behandeln Sie das Element wie ein array und greifen Sie über den Attributnamen darauf zu:

php— editable, runs on the server

Es gibt einen häufigen Fallstrick: $xml['isbn'] ist kein gewöhnlicher string — es ist ein SimpleXMLElement. Es wird problemlos ausgegeben, weil es automatisch konvertiert wird. Wenn Sie es jedoch strikt vergleichen (===) oder für später speichern, sollten Sie es zuerst casten:

<?php

$xml = new SimpleXMLElement('<book isbn="123456789"></book>');
$isbn = (string) $xml['isbn'];   // cast to a real string
var_dump($isbn === '123456789');
// bool(true)

Prüfen Sie mit isset(), ob ein Attribut vorhanden ist, bevor Sie es lesen:

<?php

$xml = new SimpleXMLElement('<book isbn="123456789"></book>');
echo isset($xml['isbn']) ? "has isbn\n" : "no isbn\n";
echo isset($xml['lang']) ? "has lang\n" : "no lang\n";
// has isbn
// no lang

Alle Attribute mit attributes() auflisten

Wenn Sie die Attributnamen nicht im Voraus kennen, rufen Sie die Methode attributes() auf. Sie gibt ein SimpleXMLElement zurück, über das Sie iterieren können, wobei der Attributname der Schlüssel und dessen Wert der entsprechende Wert ist:

<?php

$xml = new SimpleXMLElement('<book isbn="123456789" lang="en"><title>PHP Basics</title></book>');

foreach ($xml->attributes() as $name => $value) {
    echo "$name = $value\n";
}
// isbn = 123456789
// lang = en

Da das Ergebnis zählbar ist, können Sie auch die Anzahl der Attribute ermitteln:

<?php

$xml = new SimpleXMLElement('<book isbn="123456789" lang="en"></book>');
echo count($xml->attributes());
// 2

Attributwerte ändern

Um ein Attribut zu ändern, weisen Sie ihm über die array-Syntax einen neuen Wert zu und serialisieren Sie anschließend mit asXML():

php— editable, runs on the server

Attribute hinzufügen

Ein neues Element aus simplexml_load_string() oder new SimpleXMLElement() besitzt möglicherweise nicht das Attribut, das Sie benötigen. Fügen Sie es mit addAttribute() hinzu, indem Sie Name und Wert übergeben:

php— editable, runs on the server

Beachten Sie, dass eine Zuweisung an ein noch nicht vorhandenes Attribut ($xml['isbn'] = '...') dieses ebenfalls anlegt — addAttribute() ist jedoch die einzige Möglichkeit, ein namespace-qualifiziertes Attribut hinzuzufügen.

Ein Attribut entfernen

Es gibt keine dedizierte „Entfernen"-Methode. Heben Sie das Attribut mit unset() auf:

<?php

$xml = new SimpleXMLElement('<book isbn="123456789" lang="en"></book>');
unset($xml['lang']);
echo $xml->asXML();
// <?xml version="1.0"?>
// <book isbn="123456789"/>

Namespace-Attribute

Attribute, die zu einem XML-Namespace gehören (zum Beispiel meta:rating), werden bei einem einfachen attributes()-Aufruf ohne Argumente nicht angezeigt. Übergeben Sie die Namespace-URI, um sie auszulesen:

<?php

$xml = new SimpleXMLElement(
    '<book xmlns:meta="http://example.com/meta" meta:rating="5"><title>PHP Basics</title></book>'
);

foreach ($xml->attributes('http://example.com/meta') as $name => $value) {
    echo "$name = $value\n";
}
// rating = 5

Zusammenfassung

  • Ein einzelnes Attribut lesen Sie mit der array-Syntax: $xml['isbn']. Casten Sie es zu (string) für strikte Vergleiche.
  • Alle Attribute iterieren Sie mit attributes(); das Ergebnis ist iterierbar und zählbar.
  • Weisen Sie einen neuen Wert zu, um ein Attribut zu ändern, nutzen Sie addAttribute() zum Hinzufügen und unset() zum Entfernen.
  • Übergeben Sie eine Namespace-URI an attributes(), um auf Namespace-Attribute zuzugreifen.

Weiterführende Informationen finden Sie unter SimpleXML-Übersicht, simplexml_load_string() und XML parsen mit SimpleXML.

Übungen

Übung
Wie lesen Sie alle Attribute eines SimpleXML-Elements, wenn Sie die Namen nicht kennen?
Wie lesen Sie alle Attribute eines SimpleXML-Elements, wenn Sie die Namen nicht kennen?
Was this page helpful?