In der PHP -Entwicklung, insbesondere bei asynchronen Anforderungen (z. B. AJAX oder Verwendung von Curl, um Daten asynchron zu erhalten), erhalten wir manchmal Daten im XML -Format und versuchen, sie mit XML_Parse zu analysieren. Viele Entwickler haben jedoch in tatsächlichen Anwendungen festgestellt, dass XML_Parse nicht immer wie erwartet funktioniert und sogar Fehler melden oder leere Daten zurückgeben können. Warum passiert das?
In diesem Artikel werden häufige Probleme und Lösungen für die Verwendung von XML_Parse analysiert, um XML -Daten in asynchronen Anforderungen zu verarbeiten.
In PHP verwandelt XML_PARSE XML über ereignisbasierte Parsen, das normalerweise mit XML_PARSER_CREAT , XML_SET_ELEMENT_HANDLER und XML_PARSE selbst verwendet wird. Zum Beispiel:
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
$data = file_get_contents("https://m66.net/api/data.xml");
if (!xml_parse($xml_parser, $data, true)) {
die(sprintf("XML Error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
xml_parser_free($xml_parser);
In einer synchronen Umgebung funktioniert dieser Code gut, tritt jedoch häufig in asynchronen Aufrufen auf.
Asynchrone Anfragen beginnen häufig mit der Verarbeitung ohne vollständig zurückgegebene Daten, wodurch die an XML_Parse übergebene XML -Zeichenfolge unvollständig und analysiert wird.
Stellen Sie beim Umgang mit asynchronen Antworten die Datenintegrität sicher und verwenden Sie bei Bedarf Cache- oder Verzögerungsverarbeitungsmechanismen, z. B. die Verwendung von Rückruffunktionen:
function onXmlDataReceived($data) {
if (strpos($data, '</root>') === false) {
// XML Vielleicht nicht vollständig zurückgekehrt
return;
}
$parser = xml_parser_create();
xml_parse($parser, $data, true);
xml_parser_free($parser);
}
Viele XML-Schnittstellen geben den utf-8-codierten Inhalt zurück, während die Standard-interne Codierung von PHP möglicherweise nicht UTF-8 ist. Wenn die Codierung nicht einheitlich ist, kann XML_Parse einen Fehler melden.
Geben Sie beim Erstellen eines Parsers Codierung an oder stellen Sie sicher, dass das XML selbst das richtige Codierungsformat deklariert:
$parser = xml_parser_create('UTF-8');
Oder zuerst Codierung und Konvertierung durchführen:
$data = mb_convert_encoding($data, 'UTF-8', 'auto');
In asynchronen Anforderungen wie Multithreading (Curl_Multi_* Funktionsfamilie) unter Verwendung von CURL kann es möglich sein, dass die erforderlichen Parser- oder Kontextinformationen vergessen werden können, die Rückruffunktion zu übergeben, was dazu führt, dass XML_Parse nicht ordnungsgemäß funktioniert.
curl_multi_add_handle($mh, $ch);
// Ich habe vergessen, den Parser oder einen anderen Kontext im Rückruf zu bestehen
class XmlParserContext {
public $parser;
public $data = '';
public function __construct() {
$this->parser = xml_parser_create();
xml_set_element_handler($this->parser, "startElement", "endElement");
xml_set_character_data_handler($this->parser, "characterData");
}
public function parse() {
xml_parse($this->parser, $this->data, true);
xml_parser_free($this->parser);
}
}
XML_PARSE selbst wirft keine Ausnahmen aus, es gibt nur einen booleschen Wert zurück, und die Fehlermeldung muss über xml_get_error_code und xml_error_string erhalten werden. Das unklare Umgang mit Fehlern kann die Probleme leicht zu verfolgen erschweren.
if (!xml_parse($parser, $data, true)) {
error_log("XML Parse Error: " . xml_error_string(xml_get_error_code($parser)));
}
Während XML_PARSE eine klassische Möglichkeit ist , XML unten zu handhaben , kann es robuster und prägnanter sein:
$xml = simplexml_load_string($data);
foreach ($xml->item as $item) {
echo $item->title;
}
oder:
$dom = new DOMDocument();
$dom->loadXML($data);
$items = $dom->getElementsByTagName('item');
Wenn Sie XML_Parse verwenden, um XML -Daten in asynchronen Anforderungen zu verarbeiten, stoßen Sie häufig Probleme wie unvollständige Daten, Nichtübereinstimmung in der Codierung und den Verlust des Kontextes. Wenn XML_Parse erforderlich ist, sollten die Erkennung von Datenintegrität und das Kontextmanagement gestärkt werden. Andernfalls wird empfohlen, XML-Parsing-Tools auf höherer Ebene wie Simplexml oder Domdocument zu verwenden, die in asynchronen Umgebungen fehlertoleranter und lesbar sind.