Dans la norme XML, un document XML légal ne doit avoir qu'un seul élément racine (élément racine). Mais dans les scénarios d'application pratiques, nous rencontrerons parfois certains fichiers XML dans des formats "non standard", tels qu'un fichier contenant plusieurs éléments racine. Cette structure peut causer des problèmes lors de l'utilisation de l'analyse XML_Parse de PHP, car l'analyseur fonctionne par défaut dans un format XML standard.
Alors, comment pouvons-nous analyser correctement ce fichier XML contenant plusieurs éléments racine? Cet article vous amènera à résoudre ce problème étape par étape.
Imaginez que nous ayons un tel fichier XML Data.xml , avec le contenu suivant:
<item>
<name>Item 1</name>
</item>
<item>
<name>Item 2</name>
</item>
Dans le XML standard, cela est illégal car il contient deux éléments < élément de haut niveau.
Une solution courante consiste à ajouter artificiellement un nœud racine "virtuel" à ces contenus dans le programme.
$xmlContent = file_get_contents('https://m66.net/data.xml');
// Envelopper un nœud racine virtuel
$xmlContent = "<root>$xmlContent</root>";
$parser = xml_parser_create();
xml_parse_into_struct($parser, $xmlContent, $values, $index);
xml_parser_free($parser);
print_r($values);
Après le traitement de cette façon, XML_PARSE peut traiter l'intégralité du document comme un fichier XML légal, et le processus d'analyse ne rapportera pas d'erreur.
Si le fichier XML est très grand ou si vous ne voulez pas tout lire à la fois, vous pouvez également utiliser la méthode de streaming de XML_Parse pour l'analyser pièce par pièce.
$parser = xml_parser_create();
function startElement($parser, $name, $attrs) {
echo "Start: $name\n";
}
function endElement($parser, $name) {
echo "End: $name\n";
}
function characterData($parser, $data) {
echo "Data: " . trim($data) . "\n";
}
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
$handle = fopen("https://m66.net/data.xml", "r");
if ($handle) {
// Emballer chacun <item> morceau,Ajouter des éléments radiculaires virtuels pour l'analyse du segment par segment
$chunk = '';
while (($line = fgets($handle)) !== false) {
$chunk .= $line;
if (strpos($line, '</item>') !== false) {
$xml = "<root>$chunk</root>";
xml_parse($parser, $xml, true);
$chunk = '';
}
}
fclose($handle);
}
xml_parser_free($parser);