Bei der Arbeit mit XML-Dokumenten in PHP ist XML_PARSE () eine niedrige, aber leistungsstarke Funktion. Es stützt sich auf ereignisgesteuerte Parsing-Modelle, sodass Sie die entsprechende Rückruffunktion registrieren müssen, um auf den Beginn, das Ende des Dokument- und die Charakterdaten zu reagieren.
Angesichts verschachtelter XML -Dokumente mit komplexen Strukturen kann die Verwendung von Rekursion die Datenverarbeitung intuitiver und klarer machen. In diesem Artikel wird vorgestellt, wie verschachtelte XML -Daten in Verbindung mit Recursion und XML_PARSE () analysiert werden.
<catalog>
<book id="1">
<title>PHP Basics</title>
<author>John Doe</author>
</book>
<book id="2">
<title>Advanced PHP</title>
<author>Jane Smith</author>
</book>
</catalog>
Wir müssen zunächst einen Parser erstellen und drei Rückruffunktionen einrichten:
startElement () : Aufgerufen, wenn der Parser auf ein Start -Tag trifft;
Endelement () : Aufgerufen, wenn der Parser auf ein End -Tag trifft;
charakterdata () : Aufgerufen, wenn der Parser im Tag auf Text trifft.
Hier ist ein vollständiges Code -Beispiel:
<?php
$xml = <<<XML
<catalog>
<book id="1">
<title>PHP Basics</title>
<author>John Doe</author>
</book>
<book id="2">
<title>Advanced PHP</title>
<author>Jane Smith</author>
</book>
</catalog>
XML;
$parser = xml_parser_create();
$dataStack = [];
$currentData = null;
// Start Tag
function startElement($parser, $name, $attrs) {
global $dataStack, $currentData;
$element = [
'tag' => $name,
'attributes' => $attrs,
'children' => [],
'value' => ''
];
if ($currentData !== null) {
array_push($dataStack, $currentData);
}
$currentData = $element;
}
// Ende Tag
function endElement($parser, $name) {
global $dataStack, $currentData;
if (!empty($dataStack)) {
$parent = array_pop($dataStack);
$parent['children'][] = $currentData;
$currentData = $parent;
}
}
// Textinhalt
function characterData($parser, $data) {
global $currentData;
if (isset($currentData['value'])) {
$currentData['value'] .= trim($data);
}
}
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
if (!xml_parse($parser, $xml, true)) {
die(sprintf("XML Fehler: %s Im %d OK",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
xml_parser_free($parser);
// Drucken Sie die endgültige Struktur
print_r($currentData);
?>
Nach der Parsen erhalten Sie eine verschachtelte Array -Struktur ähnlich wie folgt:
Array
(
[tag] => CATALOG
[attributes] => Array()
[children] => Array
(
[0] => Array
(
[tag] => BOOK
[attributes] => Array ( [ID] => 1 )
[children] => Array
(
[0] => Array ( [tag] => TITLE [value] => PHP Basics )
[1] => Array ( [tag] => AUTHOR [value] => John Doe )
)
)
[1] => Array
(
[tag] => BOOK
[attributes] => Array ( [ID] => 2 )
[children] => Array
(
[0] => Array ( [tag] => TITLE [value] => Advanced PHP )
[1] => Array ( [tag] => AUTHOR [value] => Jane Smith )
)
)
)
)
Sie können die oben genannte Array-Struktur einfach in JSON umwandeln, um Front-End-Anrufe oder Schnittstellenausgaben zu erhalten:
echo json_encode($currentData, JSON_PRETTY_PRINT);
Wenn das XML -Dokument aus dem Netzwerk stammt, wie z .
Verwandte Tags:
xml_parse