9
votes

Trouver élément avec attribut avec minidom

donné xxx

Comment puis-je obtenir le champ avec nom = "cadre.len" immédiatement sans itération à chaque étiquette et en vérifiant les attributs?


3 commentaires

Pour ajouter à cette question, le XML est de 300 Mo. J'ai manqué de mémoire la dernière fois que j'ai essayé de l'analyser. Toute suggestion de meilleures bibliothèques de style SAX?


Eh bien, xml.dom.minidom est un analyseur DOM qui doit lire l'ensemble du document en mémoire. Pas parce que ce n'est pas assez bon, mais parce que c'est ce que font les analyseurs Dom. Donc, je ne sais pas ce que vous entendez par "meilleures bibliothèques de style saxo". Quel est mauvais sur xml.sax , l'analyseur SAX standard fourni avec Python?


Après 5000 paquets (300 Mo), essayer de charger le XML bloque mon ordinateur. Sur ces 300 Mo de données, j'ai juste besoin d'environ 10 Ko qui est réparti sur le document. Existe-t-il un moyen plus efficace de traverser le XML que LXML et une bibliothèque plus simple que saxo?


3 Réponses :


2
votes

vous ne le faites pas - le DOM API , un peu mal conçu (par W3C, pas par Python! -) N'a pas une telle fonction de recherche de faire l'itération pour vous. Acceptez la nécessité de boucler (pas à travers chaque balise en général, mais à travers tout avec un nom de balise donné) ou à la mise à niveau d'une interface plus riche, telle que beauxoup ou < Code> lxml .


0 commentaires

15
votes

Je ne pense pas que vous puissiez.

de l'élément parent code>, vous devez p> xxx pré>

réagir à votre commentaire du 11 mars, si la structure de vos documents est stable et Gratuit de mauvaises surprises (comme des crochets d'angle à l'intérieur des attributs), vous voudrez peut-être essayer l'impensable et utiliser une expression régulière. Ceci n'est pas une pratique recommandée mais pourrait fonctionner et être beaucoup plus facile que d'analyser le fichier. J'avoue que je l'ai fait parfois moi-même. Je n'ai pas encore devenu aveugle. P>

Donc, dans votre cas, vous pourriez (en supposant qu'un code> balise ne s'étend pas plusieurs lignes): P>

filedump = open("myfile.xml").read()
for match in re.finditer(r'<field\s+name="frame.len"\s+([^>]+)/>', filedump):
    result = match.group(1)
    do_something(result)


0 commentaires

0
votes

wow, que Regex est horrible! À partir de 2016, il existe un .getatTtribute () code> méthode pour chaque Domelement code> qui rend les choses un peu plus faciles, mais vous devez toujours faire itération à travers les éléments.

l = []
for e in elements:
    if e.hasAttribute('name') and e.getAttribute('name') == 'field.len':
        l.append(e)


0 commentaires