2010-08-02 7 views
4

Je veux seulement analyser un élément intéressé de xml (par exemple voir ci-dessous: élément de classe avec le nom égal à math) et je veux arrêter une fois le premier élément frapper cette condition est analysée. (puisqu'il n'y a qu'une seule classe dont le nom est math, il n'est pas nécessaire de continuer une fois que l'élément est déjà trouvé).en XML: TWIG, comment arrêter d'analyser une fois trouver l'élément intéressé

Cependant, si je l'implémente comme suit, le code continue de lire le fichier entier après avoir trouvé l'élément qui m'intéresse (le fichier xml est très long donc cela prend beaucoup de temps). Ma question est de savoir comment l'arrêter une fois que l'élément first class with name = math est analysé?

my $twig = new XML::Twig(TwigRoots => {"class[\@name='math']" => \&class}); $twig->parsefile(shift @ARGV);

en plus, je veux aussi supprimer cette classe de fichier xml (non seulement de la mémoire) après avoir été analysée afin que la prochaine fois lors de l'analyse d'une classe avec d'autres noms, l'élément de classe ne sera pas analysée . Est-il possible de faire ça?

Répondre

6

Il semble que vous cherchez sont XML :: Twig de finish_print et finish_now:

finish_print

arrête le traitement Brindille, rincer la brindille et procéder pour terminer l'impression le document aussi vite que possible. Utilisez cette méthode lors de la modification d'un document et la modification est effectuée.

finish_now

Arrête le traitement brindille, ne termine pas l'analyse du document (qui pourrait effectivement être pas bien formé après le point où finish_now est appelé ). L'exécution reprend après l'appel Lparse> ou parsefile. Le contenu de la brindille est ce qui a été analysé donc loin (tous les éléments ouverts au moment où finish_now est appelé sont considérés comme fermé).

+0

Voici un exemple d'utilisation finish_now: http://cpansearch.perl.org/src/MIROD/XML-Twig-3.35/tools/xml_grep/xml_grep – DVK

+0

thx DVK. il me semble que je dois installer perl 5.10.X pour utiliser finish_now pendant que mon système. est 5.8.4. est-il facile d'installer 5.10.X? En outre, mais même avec finish_now, si une classe est derrière une classe avec beaucoup de contenu, il faut encore du temps pour s'y localiser. Puis-je indiquer un numéro de ligne d'où twig commence à analyser les éléments? Je peux utiliser grep pour obtenir le numéro de ligne de tous les éléments de la classe. pourquoi laisser la brindille chercher l'élément intéressé ligne par ligne, qui est si lent? – user399517

+0

en résumé, supposons que la classe avec le nom = math commence à partir de la ligne 2000, puis-je avoir twig analyser le xml de la ligne 2000, sans aller depuis le début du fichier xml? Je ne comprends pas pourquoi la brindille passe tellement de temps à analyser mon fichier xml même si je mets TwigRoots => {"class [\ @ name = 'math']. Je pense que ça devrait passer d'une façon ou d'une autre classes peut-être que je me trompe, il continue d'analyser ligne par ligne simplement ne les stocke pas dans la mémoire – user399517