Bei der Parsen von XML -Zeichenfolgen mithilfe von PHPs simplexml_load_string -Funktion stoßen Sie häufig auf das Problem von "illegalen Zeichen", wodurch das Parsing -Fehler verursacht wird. Diese Art von Fehler beruht normalerweise auf das Vorhandensein von Zeichen in XML -Zeichenfolgen, die nicht den XML -Spezifikationen entsprechen, z. B. Kontrollzeichen, unabgeordnete spezielle Symbole oder inkonsistente Codierungsformate. Dieser Artikel enthält eine detaillierte Erläuterung, was das Problem verursacht und Lösungen und Beispielcode bereitstellt.
Simplexml_Load_String ist eine einfache Funktion, die von PHP verwendet wird, um XML -Zeichenfolgen zu analysieren. Wenn eine XML -Zeichenfolge illegale Zeichen enthält, gibt die Funktion false zurück und eine Fehlermeldung wird ausgelöst. Illegale Charaktere enthalten im Allgemeinen:
ASCII -Steuerzeichen (z.
Zeichen, die nicht richtig entkommen sind (zum Beispiel und nicht als & amp; )
Die XML -Deklaration oder die Inhaltscodierung stimmt nicht mit der tatsächlichen Codierung überein
Nicht-UTF-8-Codierung, aber nicht deklariert
Diese Zeichen lassen den XML -Parser die String -Struktur nicht korrekt verstehen, was zu einem Fehler führt.
Steuerzeichen können durch reguläre Ausdrücke entfernt werden:
<?php
$xmlString = 'Dies enthält illegale CharaktereXMLSaite';
// Steuerzeichen löschen,Halten Sie die Linienpause(\n)、Eingeben(\r)、Tab -Symbole(\t)
$cleanXmlString = preg_replace('/[^\PC\s]/u', '', $xmlString);
$xml = simplexml_load_string($cleanXmlString);
if ($xml === false) {
echo "Analyse fehlgeschlagen\n";
} else {
print_r($xml);
}
?>
Wenn der XML -Inhalt unabgeordnete Symbole wie & , < , > usw. enthält, müssen Sie zuerst entkommen:
<?php
$xmlString = 'Dies enthält unabgeordnet&Symbol vonXMLSaite';
$xmlString = str_replace('&', '&', $xmlString);
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
echo "Analyse fehlgeschlagen\n";
} else {
print_r($xml);
}
?>
HINWEIS: Wenn es sich bereits um legale XML handelt, kann das Ersetzen von Fehlern verursacht werden und sollte für die spezifische Situation behandelt werden.
Simplexml_Load_String handelt standardmäßig UTF-8 codierte Zeichenfolgen. Wenn das XML eine weitere Codierung ist (wie GBK, ISO-8859-1), muss die Codierung zuerst konvertiert werden:
<?php
$xmlString = file_get_contents('http://gitbox.net/path/to/xmlfile.xml');
$xmlString = mb_convert_encoding($xmlString, 'UTF-8', 'GBK');
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
echo "Analyse fehlgeschlagen\n";
} else {
print_r($xml);
}
?>
Für ein besseres Debuggen kann die interne Fehlererfassung aktiviert werden:
<?php
libxml_use_internal_errors(true);
$xmlString = '<invalid&xml>';
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
foreach (libxml_get_errors() as $error) {
echo "Fehler:", $error->message;
}
libxml_clear_errors();
} else {
print_r($xml);
}
?>
Hier ist ein umfassendes Beispiel, das demonstrieren, wie illegale Charaktere aufgeräumt werden, Codierung sicherstellen und Fehler aufnehmen:
<?php
libxml_use_internal_errors(true);
$xmlString = file_get_contents('http://gitbox.net/sample.xml');
// Räumen Sie illegale Charaktere auf(Halten Sie die Linienpause、Eingeben、Tab -Symbole)
$xmlString = preg_replace('/[^\PC\s]/u', '', $xmlString);
// Code in UTF-8(Angenommen, die ursprüngliche Codierung ist GBK)
$xmlString = mb_convert_encoding($xmlString, 'UTF-8', 'GBK');
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
echo "Analyse fehlgeschlagen,Fehler信息如下:\n";
foreach (libxml_get_errors() as $error) {
echo trim($error->message), "\n";
}
libxml_clear_errors();
} else {
echo "Erfolgreiche Analyse:\n";
print_r($xml);
}
?>
Wenn Simplexml_Load_String -Parsen fehlschlägt, besteht der erste Schritt darin, zu überprüfen, ob es illegale Steuerzeichen gibt und sie angemessen reinigen.
Bestätigen Sie, dass Sonderzeichen in der XML -Zeichenfolge korrekt entkommen wurden.
Stellen Sie sicher, dass die XML-Zeichenfolge als UTF-8 codiert ist und gegebenenfalls umwandelt.
Verwenden Sie libxMl_use_internal_errors (true), um detaillierte Fehlerinformationen zu erhalten, wodurch das Problem gefunden wird.
Das Beherrschen dieser Fähigkeiten kann effektiv vermeiden, dass an illegale Charaktere Fehler verursacht werden, wodurch das Parsen von XML stabiler und zuverlässiger wird.