xml_parse_into_struct () ist eine Funktion, die auf der Expat XML -Parsing -Bibliothek basiert, und ihr Prototyp lautet wie folgt:
int xml_parse_into_struct ( resource $parser , string $data , array &$values [, array &$index ] )
$ parser : Ein von XML_PARSER_CREATE () erstellter Parser.
$ Daten : XML -Zeichenfolge analysiert werden.
$ Werte : Ein Array von XML -Datenstrukturen, die in der Reihenfolge angeordnet sind.
$ INDEX : Optional, verwendet, um den Labelnamen und den entsprechenden Index aufzuzeichnen.
Die Funktion gibt 1 zurück, um anzuzeigen, dass die Parsen erfolgreich ist, und die Funktion gibt 0 zurück, um den Fehler anzuzeigen.
XML ist eine Markup -Sprache mit sehr strengen Formatierungsanforderungen. Zu den allgemeinen Fehlern gehören:
Unbekannte Tags
Das Attribut wird nicht zitiert
Illegale Charaktere (wie Kontrollfiguren)
Tag -Verschachtelungsfehler
Beispielcode:
$data = '<root><item>Test</root>'; // Fehlen </item> Etikett
$parser = xml_parser_create();
if (!xml_parse_into_struct($parser, $data, $values)) {
echo "XML Error: " . xml_error_string(xml_get_error_code($parser));
}
xml_parser_free($parser);
Ausgabe:
XML Error: mismatched tag
Die Codierung in der XML-Deklaration (z. B. <? XML Version = "1.0" coding = "utf-8"?> ) Steht nicht mit der tatsächlichen Inhaltscodierung nicht ab, was die Analyse fehlschlägt.
Zum Beispiel wird die Datei als UTF-8 deklariert, aber der Inhalt ist tatsächlich GBK codiert, was einen illegalen Charakterfehler wirft.
Lösung :
Stellen Sie sicher, dass die Dateicodierung und die XML -Deklaration konsistent sind.
Verwenden Sie mb_convert_encoding () , um in UTF-8 zu konvertieren.
$data = mb_convert_encoding($data, 'UTF-8', 'GBK');
< , > , & " und ' in XML sind Sonderzeichen, die entkommen müssen:
< → & lt;
> → & gt;
& → & amp;
Zum Beispiel:
$data = '<note>Tom & Jerry</note>'; // Fehler:Nicht entkommen &
Sollte geändert werden in:
$data = '<note>Tom & Jerry</note>';
Etikettennamen können weder mit Zahlen oder Sonderzeichen beginnen, noch können sie Räume enthalten. Zum Beispiel:
<123tag>value</123tag> <!-- illegal -->
<tag name="a b">value</tag> <!-- Räume in Attributwerten werden nicht angegeben -->
Diese beiden Funktionen können Ihnen helfen, das Problem schnell zu finden.
if (!xml_parse_into_struct($parser, $data, $values)) {
echo "Error: " . xml_error_string(xml_get_error_code($parser)) .
" at line " . xml_get_current_line_number($parser);
}
Während der Fehlerbehebung können Sie XML in ein Online-Verifizierungstool wie https://gitbox.net/tools/xml-validator/ einfügen, um schnell Syntaxfehler zu entdecken.
Wenn der XML von einer Remote -Schnittstelle oder einer externen Datei stammt, wird empfohlen, vor dem Parsen die folgenden zu reinigen und zu protokollieren:
file_put_contents('/tmp/raw_xml.log', $data);
Es wird auch empfohlen, die folgende Reinigungsfunktion zu verwenden:
function clean_xml($data) {
$data = trim($data);
// Entfernen BOM
$data = preg_replace('/^\xEF\xBB\xBF/', '', $data);
// Unsichtbare Zeichen löschen
return preg_replace('/[^\x09\x0A\x0D\x20-\x7F\xA0-\xFF]/', '', $data);
}
Obwohl xml_parse_into_struct () DOM nicht verwendet, ist es für das Gesamtdebuggen immer noch hilfreich, wenn Sie DOM verwenden, vor dem Lesen von libxml_use_internal_errors () immer noch hilfreich ist:
libxml_use_internal_errors(true);
Für XML mit klarer Struktur und gutes Format wird Simplexml eher empfohlen:
$xml = simplexml_load_string($data);
Es bietet eine freundlichere Objektoberfläche und eine höhere Fehlertoleranz.