Rechercher un élément avec l'attribut avec minidom
Donné
<field name="frame.time_delta_displayed" showname="Time delta from previous displayed frame: 0.000008000 seconds" size="0" pos="0" show="0.000008000"/>
<field name="frame.time_relative" showname="Time since reference or first frame: 0.000008000 seconds" size="0" pos="0" show="0.000008000"/>
<field name="frame.number" showname="Frame Number: 2" size="0" pos="0" show="2"/>
<field name="frame.pkt_len" showname="Packet Length: 1506 bytes" hide="yes" size="0" pos="0" show="1506"/>
<field name="frame.len" showname="Frame Length: 1506 bytes" size="0" pos="0" show="1506"/>
<field name="frame.cap_len" showname="Capture Length: 1506 bytes" size="0" pos="0" show="1506"/>
<field name="frame.marked" showname="Frame is marked: False" size="0" pos="0" show="0"/>
<field name="frame.protocols" showname="Protocols in frame: eth:ip:tcp:http:data" size="0" pos="0" show="eth:ip:tcp:http:data"/>
Comment puis-je obtenir le champ nom="cadre".len" immédiatement, sans itération sur chaque étiquette et vérifier les attributs?
- Pour ajouter à cette question, le document xml est 300mo. J'ai manqué de mémoire la dernière fois j'ai essayé de l'analyser. Toutes les suggestions de meilleure sax style bibliothèques?
- Eh bien,
xml.dom.minidom
est un DOM parser qui a besoin de lire l'intégralité du document en mémoire. Non pas parce qu'il n'est pas assez bon, mais parce que c'est ce que DOM analyseurs n'. Donc je ne sais pas ce que tu veux dire par "mieux sax style bibliothèques". Ce qui est mauvais surxml.sax
, le standard de l'analyseur SAX qui vient avec Python? - Après 5000 paquets (300 mo), en essayant de charger le xml se bloque mon ordinateur. De que 300 mo de données, j'ai juste besoin d'environ 10 ko qui s'est répandu à travers tout le document. Est-il un moyen plus efficace de traversant le xml que lxml et plus simple de la bibliothèque de sax?
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas que vous le pouvez.
Du parent
element
, vous devezDe réagir à votre commentaire du 11 Mars, si la structure de vos documents est stable et exempt de mauvaises surprises (comme les crochets à l'intérieur d'attributs), vous pourriez essayer de l'impensable et de l'utilisation d'une expression régulière. Ce n'est pas une pratique recommandée, mais pour travailler et être plus facile que l'analyse du fichier. J'avoue que je n'ai fait que parfois moi-même. N'est pas allé à l'aveugle encore.
Donc, dans votre cas, vous pouvez (en supposant qu'une
<field>
balise de ne pas s'étendre sur plusieurs lignes):Si un
<field>
tag peut s'étendent sur plusieurs lignes, vous pouvez essayer de charger la totalité du fichier en texte brut dans la mémoire et puis il analyse les matches:Dans les deux cas,
result
contiendra les attributs autres queframe.len
. La regex suppose queframe.len
est toujours le premier attribut de l'intérieur de la balise.Vous n'avez pas -- la API DOM, un peu mal conçu (par le w3c, pas en Python!-) n'ont pas une fonction de recherche pour faire l'itération pour vous. Soit accepter la nécessité de la boucle (et non pas par chaque tag en général, mais par l'ensemble avec un tag donné le nom), ou la mise à niveau vers un son plus riche de l'interface, tels que
BeautifulSoup
oulxml
.Wow, que la regex est horrible!!! À compter de 2016, il y a un
.getAttribute()
méthode pour chaqueDOMElement
qui rend les choses un peu plus facile, mais vous avez encore pour itérer sur les éléments.