Der integrierte XML-Parser von PHP (basierend auf der Expat-Bibliothek) ist ein sehr leistungsstarkes Tool für komplexe XML-Daten. Durch XML_PARSER_CREATE () und die begleitenden Verarbeitungsfunktionen können wir die XML -Struktur flexibel analysieren. Insbesondere wenn Sie mit Tiefenschachtel und vielen Elementen mit XML -Dokumenten konfrontiert sind, verbessert ein benutzerdefinierter Element -Handler die Effizienz und die Lesbarkeit der Parsen erheblich.
In diesem Artikel wird ausführlich erläutert, wie Sie XML_Set_Element_handler () verwenden, um den XML -Elementprozessor anzupassen und eine komplexe XML -Datenstruktur mit Beispielcode zu analysieren.
Bei der Parsen von XML -Streams mit XML_PARSE () können wir zwei Rückruffunktionen für den Parser über XML_Set_Element_handler () registrieren:
StartElementHandler : Die Rückruffunktion, um das Tag zu starten
EndelementHandler : Rückruffunktion zum Ende von Tags
Die Signaturen dieser beiden Funktionen sind normalerweise wie folgt:
function startElement($parser, $name, $attrs)
function endElement($parser, $name)
Wenn $ Name der Name des aktuellen Knotens und des $ attrs ist, ist das assoziative Array, das die Attribute des Knotens darstellt.
Angenommen, wir erhalten XML -Daten im folgenden Format aus einer API:
<catalog>
<book id="001">
<title>PHP Entwicklungspraxis</title>
<author>Zhang San</author>
<price currency="CNY">89.00</price>
</book>
<book id="002">
<title>Eingehendes Verständnis XML</title>
<author>Li Si</author>
<price currency="CNY">75.50</price>
</book>
</catalog>
Wir werden einen Parser schreiben, der den Titel-, Autor- und Preisinformationen für jedes Buch extrahiert und ihn ausgibt.
<?php
$xmlData = file_get_contents('https://m66.net/api/books.xml');
// Wird verwendet, um Parsen -Ergebnisse zu speichern
$books = [];
$currentBook = [];
$currentTag = "";
// erstellen XML Parser
$parser = xml_parser_create("UTF-8");
// Stellen Sie die Verarbeitungsfunktionen für die Start- und End -Tags fest
xml_set_element_handler($parser, "startElement", "endElement");
// Legen Sie die Funktion zur Verarbeitungsfunktion der Charakterdaten fest
xml_set_character_data_handler($parser, "characterData");
// 设置Parser参数
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false); // Bleiben Sie den Etikettenfall konsistent
// Verarbeitungsfunktionen definieren
function startElement($parser, $name, $attrs) {
global $currentBook, $currentTag;
$currentTag = $name;
if ($name == "book") {
$currentBook = [
"id" => $attrs['id'] ?? null,
"title" => "",
"author" => "",
"price" => "",
"currency" => ""
];
}
if ($name == "price" && isset($attrs['currency'])) {
$currentBook['currency'] = $attrs['currency'];
}
}
function endElement($parser, $name) {
global $books, $currentBook, $currentTag;
if ($name == "book") {
$books[] = $currentBook;
$currentBook = [];
}
$currentTag = "";
}
function characterData($parser, $data) {
global $currentBook, $currentTag;
$data = trim($data);
if (empty($data)) return;
switch ($currentTag) {
case "title":
$currentBook["title"] .= $data;
break;
case "author":
$currentBook["author"] .= $data;
break;
case "price":
$currentBook["price"] .= $data;
break;
}
}
// Parsen ausführen
if (!xml_parse($parser, $xmlData, 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);
// Ausgangsanalyseergebnisse
foreach ($books as $book) {
echo "Buchtitel: {$book['title']}\n";
echo "Autor: {$book['author']}\n";
echo "Preis: {$book['price']} {$book['currency']}\n";
echo "------------------------\n";
}
Verfolgung des Kontextes mithilfe von Statusvariablen <br> Staatliche Variablen wie $ currentTag und $ currentBook sind sehr kritisch, wenn sie tief verschachtelt sind, und können Ihnen helfen, festzustellen, in welchem Knoten Sie sich derzeit befinden.
Filter weiße Zeichen
CharakterData kann eine große Anzahl von Neulinen und Räumen erhalten, und Sie müssen () abschneiden, um festzustellen, ob es leer ist.
Vermeiden Sie wiederholte Aufgaben <br> Einige Tag -Inhalte können in mehreren Segmenten (insbesondere langer Text) zurückgegeben werden, und verwenden . = Spleißen können Datenkürzungen verhindern.
Verwenden von Namespace zur Verarbeitung des komplexen XML
Wenn XML einen Namespace verwendet, wird empfohlen, erweiterte APIs wie xml_set_start_namespace_decl_handler () zu verwenden, um mit Parsen zusammenzuarbeiten.