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 ?
Réponses
Trop de publicités?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.
- Réponses précédentes
- Plus de réponses
0 votes
amolnpujari.wordpress.com/2012/03/31/reading_huge_xml-rb il est si simple de traiter de gros fichiers xml en ruby