Aktueller Standort: Startseite> Neueste Artikel> xml_parse können verschachtelte Tags nicht korrekt verarbeiten: Häufige Fehler und Lösungen

xml_parse können verschachtelte Tags nicht korrekt verarbeiten: Häufige Fehler und Lösungen

M66 2025-04-24

Bei Verwendung von PHP zur Verarbeitung von XML -Daten ist XML_PARSE () eine relativ grundlegende Funktion, die zur XML -Parser -Erweiterung von PHP gehört (basierend auf Expat). Viele Entwickler begegnen jedoch häufig Situationen, die nicht korrekt behandelt werden können, wenn sie verschachtelte Tags analysieren. Dieser Artikel wird Sie in das tiefe Verständnis der Ursachen dieses Problems einnehmen und praktische Lösungen bereitstellen.

1. Einführung in das Arbeitsprinzip von XML_Parse

xml_parse () verwendet ein ereignisorientiertes Modell, um XML-Dokumente zu verarbeiten. Wenn der Parser das Start -Tag-, End -Tag- oder Zeichendaten liest, wird die entsprechende Rückruffunktion aufgerufen.

Der Beispielinitialisierungscode lautet wie folgt:

 $parser = xml_parser_create();

xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");

$data = '<book><title>PHP Guide</title><author>John</author></book>';
xml_parse($parser, $data, true);
xml_parser_free($parser);

In diesem Beispiel löst der Parser die Rückruffunktionen für Startelement- , Charakterdaten und Endelement -Rückrufe aus.

2. Warum können XML_Parse verschachtelte Tags nicht richtig handeln?

Die Hauptgründe sind wie folgt:

1. Die Logik der Callback -Funktionsverarbeitung ist unvollständig

Viele Entwickler behalten nicht ordnungsgemäß an Parsen -Staat oder -struktur bei, wenn sie sich mit verschachtelten Tags befassen. Da xml_parse () nicht automatisch hilft, eine XML -Baumstruktur zu erstellen, müssen verschachtelte Daten manuell erstellt werden.

Beispielsweise kann der folgende Code verschachtelte Knoten nicht richtig verarbeitet:

 function startElement($parser, $name, $attrs) {
    global $currentTag;
    $currentTag = $name;
}

function characterData($parser, $data) {
    global $currentTag;
    echo "$currentTag: $data\n";
}

In verschachtelten Tags wird $ currentTag ständig überschrieben, was zu der Unfähigkeit führt, zu identifizieren, zu welchem ​​Tag die Daten gehört.

2. Die Stapelstruktur wird nicht verwendet, um einen verschachtelten Zustand zu retten

Um verschachtelte XML zu analysieren, wird empfohlen, einen Stapel zu verwenden, um den aktuellen Tag -Pfad beizubehalten:

 $tagStack = [];

function startElement($parser, $name, $attrs) {
    global $tagStack;
    array_push($tagStack, $name);
}

function endElement($parser, $name) {
    global $tagStack;
    array_pop($tagStack);
}

function characterData($parser, $data) {
    global $tagStack;
    $path = implode(' > ', $tagStack);
    echo "[$path] $data\n";
}

Dieser Code kann die Hierarchie verschachtelter Tags deutlicher zeigen, beispielsweise:

 <article>
    <header><title>Nachrichten Titel</title></header>
    <body>Inhaltsabschnitt</body>
</article>

Die Ausgabe wird sein:

 [ARTICLE > HEADER > TITLE] Nachrichten Titel
[ARTICLE > BODY] Inhaltsabschnitt

3. Die Daten sind fälschlicherweise verkürzt oder unvollständig

Wenn die in xml_parse () übergebenen Daten unvollständig sind oder nicht korrekt als wahr sind wie der Parameter IS_FINAL (d. H. Der letzte Parameter) ist auch zutrifft , dass das Parsen fehlschlägt:

 xml_parse($parser, $data, true); // Der dritte Parameter muss sein true Zeigt an, dass die Daten abgeschlossen sind

3. Wie kann man verschachtelte XML richtig analysieren?

Die am meisten empfohlene Möglichkeit ist die Verwendung eines XML-Parsers auf höherer Ebene, wie z. B.:

1. Simplexml

 $xml = simplexml_load_string('<book><title>PHP Guide</title></book>');
echo $xml->title; // Ausgabe: PHP Guide

2. Domdokument

 $doc = new DOMDocument();
$doc->loadXML('<site><url>https://m66.net</url></site>');
$nodes = $doc->getElementsByTagName('url');
echo $nodes->item(0)->nodeValue; // Ausgabe: https://m66.net

Diese Parser haben die verschachtelte Struktur von Knoten für Sie bearbeitet, der Code ist klarer und die Wartung ist einfacher.

4. Zusammenfassung und Vorschläge

  • XML_PARSE () verwendet ereignisgesteuerte Modelle und baut strukturierte Bäume nicht automatisch, sodass verschachtelte Tags manuell verarbeitet werden müssen.

  • Es wird empfohlen, eine Stapelstruktur zu verwenden, um den aktuellen Tag -Pfad zu verfolgen.

  • In Projekten wird empfohlen, in Projekten nicht ausdrücklich erforderlich, wenn nicht ausdrücklich erforderlich ist, dass SimpXML oder Domdocument für verschachtelte XML verarbeitet werden.

  • Achten Sie auf die Integrität der eingehenden Daten, um eine Kürzung zu vermeiden.

XML Parsing ist eigentlich nicht kompliziert. Der Schlüssel ist, das richtige Werkzeug auszuwählen und seine zugrunde liegenden Prinzipien zu verstehen. Ich hoffe, dieser Artikel kann Ihnen helfen, sich besser mit verschachtelten XML -Fragen in der tatsächlichen Entwicklung zu befassen.