2010-03-05 7 views
2

J'ai un fichier XML massif. Cependant, je ne m'intéresse qu'à un seul petit sous-arbre de cet arbre massif. Je veux analyser ce sous-arbre, mais je ne veux pas perdre de temps à analyser tout l'arbre massif quand je n'en utiliserai qu'une petite partie.seulement analyser un sous-arbre spécifique d'un fichier XML

Idéalement, je voudrais parcourir le fichier jusqu'à ce que je trouve le début de cette sous-arborescence, analyser la sous-arborescence jusqu'à ce que j'atteigne la fin, et même pas la peine de lire le reste du fichier. Peut-être même décrire le sous-arbre qui m'intéresse avec une expression XPath. Y at-il un moyen de le faire en utilisant lxml? Il semble que vous puissiez faire quelque chose comme ça en utilisant la méthode iterparse(), mais en se basant sur les docs, il semblerait que cela ne produise pas un objet analysé, que je veux utiliser. Aucune suggestion?

(L'utilisation lxml n'est pas nécessaire, mais je veux utiliser Python, et idéalement, je voudrais que ce soit rapide.)

Répondre

1

J'ai l'impression que iterparse est ce que vous voulez. En regardant la section « événements d'étiquette sélective » à http://lxml.de/parsing.html il semble que vous donne ce que vous désirez:

context = etree.iterparse(xmlfile, tag="yourSubTree") 
action, elem = context.next() 
etree.iterwalk(elem, ...)... 

On dirait XPath pourrait aussi fonctionner, mais je suppose que XPath lit dans l'arbre entier avant de revenir alors que je Je m'attends à ce que l'iterparse ne marche que jusqu'à l'arbre. Il vaudrait la peine de décrire les deux approches.

0

Iterparse nécessitera toujours l'analyse de tout le sous-arbre que vous voulez. Il peut être plus efficace d'extraire le sous-arbre avant de le placer dans l'analyseur avec une expression régulière. Vous pourriez vouloir essayer d'écrire un analyseur de sax. Sax est probablement plus lent que lxml, mais il n'utilisera pas beaucoup de mémoire, donc dans certains cas ce sera peut-être mieux.

Questions connexes