Im XML -Standard sollte ein legales XML -Dokument nur ein Stammelement (Stammelement) haben. In praktischen Anwendungsszenarien stoßen wir jedoch manchmal auf einige XML-Dateien in "nicht standardmäßigen" Formaten, z. B. eine Datei mit mehreren Rootelementen. Diese Struktur kann Probleme verursachen, wenn der XML_Parse -Parser von PHP verwendet wird, da der Parser standardmäßig in einem Standard -XML -Format arbeitet.
Wie können wir diese XML -Datei mit mehreren Stammelementen richtig analysieren? In diesem Artikel werden Sie Schritt für Schritt dazu gebracht, dieses Problem zu lösen.
Stellen Sie sich vor, wir haben eine solche XML -Dateidaten.xml mit dem folgenden Inhalt:
<item>
<name>Item 1</name>
</item>
<item>
<name>Item 2</name>
</item>
In Standard-XML ist dies illegal, da es zwei Elemente der obersten Ebene enthält.
Eine gemeinsame Lösung besteht darin, diesen Inhalten künstlich einen "virtuellen" Stammknoten im Programm hinzuzufügen.
$xmlContent = file_get_contents('https://m66.net/data.xml');
// Wickeln Sie einen virtuellen Stammknoten ein
$xmlContent = "<root>$xmlContent</root>";
$parser = xml_parser_create();
xml_parse_into_struct($parser, $xmlContent, $values, $index);
xml_parser_free($parser);
print_r($values);
Nach der Verarbeitung auf diese Weise kann XML_PARSE das gesamte Dokument als legale XML -Datei behandeln, und der Analyseprozess meldet keinen Fehler.
Wenn die XML -Datei sehr groß ist oder Sie nicht alles auf einmal lesen möchten, können Sie auch die Streaming -Methode von XML_Parse verwenden, um sie Stück für Stück zu analysieren.
$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) {
// Packen Sie jeweils ein <item> Stück,Fügen Sie virtuelle Stammelemente für das Parsing -Segment nach Segment hinzu
$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);