67 votes

Analyse d'énormes fichiers XML en PHP

J'essaie d'analyser les fichiers XML du contenu et des structures de DMOZ dans MySQL, mais tous les scripts existants pour ce faire sont très anciens et ne fonctionnent pas bien. Comment puis-je ouvrir un gros fichier XML (1 Go) en PHP pour l'analyser ?

0 votes

amolnpujari.wordpress.com/2012/03/31/reading_huge_xml-rb il est si simple de traiter de gros fichiers xml en ruby

0voto

Nigel Ren Points 30531

J'ai écrit un wrapper pour XMLReader pour (IMHO) rendre plus facile l'obtention des éléments que vous recherchez. Le wrapper vous permet d'associer un ensemble de chemins des éléments de données et un callback à exécuter lorsque ce chemin est trouvé. Le chemin permet des expressions regex et aussi des groupes de capture qui peuvent aussi être passés à la callback.

La bibliothèque se trouve à https://github.com/NigelRel3/XMLReaderReg et peut également être installé en utilisant composer require nigelrel3/xml-reader-reg .

Un exemple d'utilisation...

$inputFile = __DIR__ ."/../tests/data/simpleTest1.xml";
$reader = new XMLReaderReg\XMLReaderReg();
$reader->open($inputFile);

$reader->process([
    '(.*/person(?:\[\d*\])?)' => function (SimpleXMLElement $data, $path): void {
        echo "1) Value for ".$path[1]." is ".PHP_EOL.
            $data->asXML().PHP_EOL;
    },
    '(.*/person3(\[\d*\])?)' => function (DOMElement $data, $path): void {
        echo "2) Value for ".$path[1]." is ".PHP_EOL.
            $data->ownerDocument->saveXML($data).PHP_EOL;
    },
    '/root/person2/firstname' => function (string $data): void {
        echo "3) Value for /root/person2/firstname is ". $data.PHP_EOL;
    }
    ]);

$reader->close();

Comme on peut le voir dans l'exemple, vous pouvez obtenir les données à transmettre sous la forme d'un SimpleXMLElement, d'un DOMElement ou d'une chaîne de caractères. Cela représentera uniquement les données qui correspondent au chemin.

Les chemins montrent également comment les groupes de capture peuvent être utilisés. (.*/person(?:\[\d*\])?) recherche tout élément personnel (y compris les tableaux d'éléments) et $path[1] dans le callback affiche le chemin où se trouve cette instance particulière.

Il existe un exemple étendu dans la bibliothèque ainsi que des tests unitaires.

-5voto

Ozzy Points 3051

Avez-vous essayé d'utiliser la bibliothèque simplexml qui est intégrée à php ?

http://php.net/simplexml

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X