Die Verarbeitung von XML in PHP ist eine häufigste Anforderung, insbesondere wenn Sie mit Schnittstellen von Drittanbietern oder Verarbeitungskonfigurationsdateien docken. xml_parse () ist eine von PHP bereitgestellte Funktion, um XML -Daten zu analysieren. Wenn Sie sich jedoch mit XML mit vielen verschachtelten Strukturen oder komplexen Formaten befassen, können Sie Parsing -Fehler stoßen, wenn Sie nicht vorsichtig sind, was dazu führt, dass Daten nicht korrekt gelesen werden oder das Programm direkt abstürzt.
In diesem Artikel wird erläutert, wie häufiges Parsenfehler bei Verwendung von XML_PARSE () zur Behandlung verschachtelter XML und praktischer Codebeispiele vermieden werden.
Das XML-Parsing von PHP verwendet normalerweise den ereignisorientierten Modus und wird mit den folgenden Funktionen verwendet:
xml_parser_create ())
xml_parse ()
Hier ist ein grundlegendes XML -Parsing -Beispiel:
<?php
$xml = <<<XML
<books>
<book>
<title>PHP Programmierung</title>
<author>Zhang San</author>
</book>
<book>
<title>XML Eigentlicher Kampf</title>
<author>Li Si</author>
</book>
</books>
XML;
$parser = xml_parser_create();
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
function startElement($parser, $name, $attrs) {
echo "Element starten: $name\n";
}
function endElement($parser, $name) {
echo "Endelement: $name\n";
}
function characterData($parser, $data) {
if (trim($data)) {
echo "Zeichendaten: $data\n";
}
}
if (!xml_parse($parser, $xml, true)) {
die("XML Fehler: " . xml_error_string(xml_get_error_code($parser)) .
" Im " . xml_get_current_line_number($parser) . " OK");
}
xml_parser_free($parser);
?>
Die charakterdata -Rückruffunktion kann mehrmals ausgelöst werden, wenn Elemente tief verschachtelt sind, insbesondere wenn Zeilenpausen oder Räume zwischen den Elementen bestehen. Der Inhalt sollte mit Cache -Variablen gesammelt und dann in Endelement () verarbeitet werden.
$depth = 0;
$currentTag = '';
$contentBuffer = [];
function startElement($parser, $name, $attrs) {
global $depth, $currentTag;
$depth++;
$currentTag = $name;
}
function endElement($parser, $name) {
global $depth, $currentTag, $contentBuffer;
if (isset($contentBuffer[$depth])) {
echo "Element $name Der Wert von: " . trim($contentBuffer[$depth]) . "\n";
unset($contentBuffer[$depth]);
}
$depth--;
}
function characterData($parser, $data) {
global $depth, $contentBuffer;
if (!isset($contentBuffer[$depth])) {
$contentBuffer[$depth] = '';
}
$contentBuffer[$depth] .= $data;
}
Einige XML können illegale Zeichen enthalten, wie z .
$xml = preg_replace('/[^\x09\x0A\x0D\x20-\x7F]/u', '', $xml); // Entfernen Sie illegale Zeichen
$xml = str_replace('&', '&', $xml); // Entfliehen Sie uneingeschränkt &
Achten Sie darauf, nicht wiederholt zu entkommen, um sicherzustellen, dass legitime XML -Unternehmen nicht zerstört werden.
Stellen Sie sicher, dass die XML-Daten bei der Erstellung von Parsers utf-8 codiert und angegeben sind:
$parser = xml_parser_create('UTF-8');
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
Wenn eine verschachtelte XML -Struktur komplex ist, wird empfohlen, eine Stapelstruktur zu verwenden, um die Etikettenebene aufzuzeichnen, um die nachfolgende strukturierte Verarbeitung zu erleichtern.
$elementStack = [];
function startElement($parser, $name, $attrs) {
global $elementStack;
array_push($elementStack, $name);
}
function endElement($parser, $name) {
global $elementStack;
array_pop($elementStack);
}
Durch den Stapel können Sie den aktuellen Pfad oder die Hierarchie in Echtzeit erhalten und sogar ein mehrdimensionales Array erstellen, um die XML-Struktur darzustellen.
Achten Sie bei externen XML -Quellen auf die Ausnahmeverarbeitung, um zu verhindern, dass die Seite aufgrund des Parsing -Fehlers stürzt.
Verwenden Sie libxml_use_internal_errors () mit SimplexML_Load_string () als alternative Lösung zum Ausfall des Prozesses.
Wenn Sie XML von einer Schnittstelle wie https://api.m66.net/data.xml lesen, verwenden Sie bitte zuerst Datei_get_Contents (), um den Inhalt zu lesen, und geben Sie ihn dann in den Parser weiter, um zu vermeiden, dass Netzwerkfehler sich auf die logische Verarbeitung auswirken.
$xmlContent = file_get_contents("https://api.m66.net/data.xml");
if ($xmlContent === false) {
die("Nicht laden können XML Daten");
}
Bei der Verwendung von XML_PARSE () zur Verarbeitung verschachtelter XML stammen häufig gemeinsame Parsingfehler aus inkonsistenten Zeichendaten, illegalen Zeichen, unregelmäßiger Codierung oder unklarer Parsing -Logik. Durch angemessene Codierungsspezifikationen, Vorverarbeitung und strukturiertes Design können Sie die Robustheit und Stabilität der XML -Parsen erheblich verbessern.
Das Beherrschen der zugrunde liegenden Parsing -Logik kann Ihnen auch helfen, XML -Datenstrukturen effizient zu verarbeiten, wenn Sie fortschrittliche XML -Bibliotheken wie Simplexml oder Domdocument nicht verwenden können.
Wenn Sie den Analyseprozess weiter vereinfachen müssen, können Sie in Betracht ziehen, eine Klasse zu verkörpern, um die Parser- und Datenerfassungslogik zu verwalten, die den Code besser wiederverwenden und verwalten kann.