Es ist eine häufige Möglichkeit, XML mit der XML_PARSE -Funktion in PHP zu analysieren. Wenn jedoch eine XML-Datei spezielle Zeichen (z. B. & , < , > oder illegale UTF-8-Zeichen) enthält, ist es leicht, an Parsenfehler oder sogar Skriptfehlern zu führen. In diesem Artikel werden mehrere häufige Probleme in der tatsächlichen Entwicklung untersucht und entsprechende Lösungen bereitgestellt, um zu vermeiden, dass beim Analysieren von XML mit Sonderzeichen in gemeinsame Fallen gerät.
XML verlangt, dass die Charaktere legale UTF-8-Zeichen sein müssen. Wenn die Eingabe illegale Zeichen (z. B. Steuerzeichen oder illegale Codierung) enthält, gibt XML_Parse einen Fehler direkt zurück.
Verwenden Sie iConv oder mb_convert_encoding, um den Inhalt vorzubereiten:
$rawXml = file_get_contents('https://m66.net/data.xml');
$cleanXml = mb_convert_encoding($rawXml, 'UTF-8', 'UTF-8');
Oder verwenden Sie regelmäßig, um illegale Kontrollfiguren zu löschen:
$cleanXml = preg_replace('/[^\x09\x0A\x0D\x20-\x7E\xA0-\xFF]/', '', $rawXml);
In XML und muss als & amp; . Wenn das ursprüngliche XML -Dokument ein unabgeordnetes & xml_parse enthält, meldet XML_Par einen Fehler.
Sie können HTMLSpecialChars oder Str_Replace zur Vorverarbeitung verwenden.
$cleanXml = str_replace('&', '&', $rawXml);
// Beachten:Dies ist nur ein Beispiel,Bei der Verwendung müssen Sie feststellen, ob es entkommen ist.,Vermeiden Sie wiederholte Flucht
Eine sicherere Möglichkeit ist zu überprüfen, ob XML legal ist:
libxml_use_internal_errors(true);
$xml = simplexml_load_string($rawXml);
if (!$xml) {
foreach (libxml_get_errors() as $error) {
echo "XML Error: " . $error->message;
}
}
Wenn der XML -Dateiheader die Codierung nicht angibt oder nicht mit der tatsächlichen Codierung übereinstimmt, kann ein XML_PARSE -Fehler auftreten.
Erzwingen Sie den Standard -Header in XML, um eine konsistente Codierung zu gewährleisten:
if (strpos($rawXml, '<?xml') === false) {
$rawXml = '<?xml version="1.0" encoding="UTF-8"?>' . $rawXml;
}
Entwickler vergessen manchmal, XML_PARSER_FREE aufzurufen, was zu Ressourcenleckagen oder abnormalem Verhalten führt.
$parser = xml_parser_create('UTF-8');
xml_set_element_handler($parser, 'startElement', 'endElement');
xml_set_character_data_handler($parser, 'characterData');
if (!xml_parse($parser, $cleanXml, true)) {
die(sprintf("XML Error: %s at line %d",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
xml_parser_free($parser);
Standardmäßig wird keine Ausnahme ausgelöst, nachdem in XML_PARE ein Fehler auftritt, und Fehlerinformationen müssen manuell überprüft werden.
Verwenden Sie Fehlererkennungsfunktionen wie xml_get_error_code () und xml_error_string (), um die Debugging -Effizienz zu verbessern.
Obwohl XML_PARSE eine zugrunde liegende und gut leistungsstarke Parsen-Methode ist, müssen Sie bei der Verwendung sehr vorsichtig mit den Problemen der Legitimität und der Charaktercodierung von XML vorsichtig sein. Wir empfehlen, zunächst vor der Verringerung der Erkennung von Codierungsprüfschundfehlern beim Umgang mit nicht vertrauenswürdigen oder von Drittanbietern bereitgestellten XML-Dateien durchzuführen, um das Risiko eines analysierenden Fehlers zu minimieren.
Wenn es komplexere XML-Strukturen und -anforderungen gibt, können Sie auch modernere Parsing-Tools wie Domdocument oder simplexml verwenden, die für Sonderzeichen mehr fehlertoleranter sind und prägnanter zu verwenden sind.
Verwandte Tags:
xml_parse