Aktueller Standort: Startseite> Neueste Artikel> So analysieren Sie XML -Dateien mehrerer Rootelemente über XML_PARSE

So analysieren Sie XML -Dateien mehrerer Rootelemente über XML_PARSE

M66 2025-04-28

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.

Frage Beispiel

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.

Methode 1: Paket in einen einzelnen Knoten

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.

Methode 2: Analysieren Sie mehrere Fragmente nach Linie

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);