Aktueller Standort: Startseite> Neueste Artikel> So können Sie den Elementprozessor von XML_Parse an komplexe XML -Datenstrukturen anpassen

So können Sie den Elementprozessor von XML_Parse an komplexe XML -Datenstrukturen anpassen

M66 2025-05-13

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.

1. Was ist ein XML -Elementprozessor?

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.

2. Beispiel: Analysieren Sie eine verschachtelte komplexe XML -Daten

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.

3.. Benutzerdefinierte Prozessorimplementierung

 <?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";
}

4. Optimierungstechniken und Vorschläge

  1. 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.

  2. 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.

  3. 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.

  4. 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.