Dans le développement de PHP, en particulier lors de la création de demandes asynchrones (comme AJAX ou en utilisant CURL pour obtenir des données de manière asynchrone), nous recevons parfois des données au format XML et essayons de l'analyser avec XML_Parse . Cependant, de nombreux développeurs ont trouvé dans les applications réelles que XML_PARSE ne fonctionne pas toujours comme prévu et peut même signaler les erreurs ou renvoyer des données vides. Alors, pourquoi cela se produit-il?
Cet article analysera des problèmes et des solutions courants pour l'utilisation de XML_Parse pour traiter les données XML dans les demandes asynchrones.
Dans PHP, XML_PARSE gère XML par l'analyse basée sur des événements, qui est généralement utilisée avec XML_PARSER_CREATE , XML_SET_ELlement_Handler et XML_Parse lui-même. Par exemple:
$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);
Dans un environnement synchrone, ce code fonctionne bien, mais se produit souvent dans les appels asynchrones.
Les demandes asynchrones commencent souvent à traiter sans renvoyer complètement des données, ce qui fait passer la chaîne XML à XML_Parse incomplète et l'analyse de défaillance.
Lors de la gestion des réponses asynchrones, assurez l'intégrité des données et utilisez des mécanismes de traitement du cache ou retardés si nécessaire, tels que l'utilisation des fonctions de rappel:
function onXmlDataReceived($data) {
if (strpos($data, '</root>') === false) {
// XML Peut-être pas complètement retourné
return;
}
$parser = xml_parser_create();
xml_parse($parser, $data, true);
xml_parser_free($parser);
}
De nombreuses interfaces XML renvoient le contenu codé UTF-8, tandis que le codage interne par défaut de PHP peut ne pas être UTF-8. Si le codage n'est pas uniforme, XML_PARSE peut signaler une erreur.
Spécifiez le codage lors de la création d'un analyseur ou assurez-vous que le XML lui-même déclare le format de codage correct:
$parser = xml_parser_create('UTF-8');
Ou faites d'abord le codage et la conversion:
$data = mb_convert_encoding($data, 'UTF-8', 'auto');
Dans les demandes asynchrones, telles que le multithreading (curl_multi_ * la famille de fonctions) en utilisant CURL, il peut être possible que les informations d'analyseur ou de contexte nécessaires soient oubliées de passer dans la fonction de rappel, ce qui fait que XML_PARSE ne fonctionne pas correctement.
curl_multi_add_handle($mh, $ch);
// Oublié de passer l'analyseur ou un autre contexte dans le rappel
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 lui-même ne lancera pas des exceptions, il ne renverra qu'une valeur booléenne et le message d'erreur doit être obtenu via XML_GET_ERROR_CODE et XML_ERROR_STRING . La manipulation des erreurs peu claire peut facilement rendre les problèmes difficiles à suivre.
if (!xml_parse($parser, $data, true)) {
error_log("XML Parse Error: " . xml_error_string(xml_get_error_code($parser)));
}
Alors que XML_Parse est un moyen classique de gérer XML en bas, l'utilisation de simplexml ou de domDocument dans les demandes asynchrones peut être plus robuste et concise:
$xml = simplexml_load_string($data);
foreach ($xml->item as $item) {
echo $item->title;
}
ou:
$dom = new DOMDocument();
$dom->loadXML($data);
$items = $dom->getElementsByTagName('item');
Lorsque vous utilisez XML_PARSE pour traiter les données XML dans les demandes asynchrones, vous rencontrez souvent des problèmes tels que des données incomplètes, une non-correspondance dans le codage et la perte de contexte. Si xml_parse est requis, la détection d'intégrité des données et la gestion du contexte doivent être renforcées. Sinon, il est recommandé d'utiliser des outils d'analyse XML de niveau supérieur tels que SimplexML ou DomDocument , qui sont plus tolérants aux pannes et lisibles dans des environnements asynchrones.
Étiquettes associées:
xml_parse