2010-03-03 6 views
4

Je l'exemple XML suivantPython XML au dictionnaire pour itérer sur les éléments

<?xml version="1.0"?> 
<test> 
    <items> 
     <item>item 1</item> 
     <item>item 2</item> 
    </items> 
</test> 

je dois itérer sur chaque étiquette dans une boucle en python. Si essayé beaucoup de choses mais je ne peux pas le faire ..

merci pour l'aide

+0

S'il vous plaît montrer certaines des choses que vous avez essayé. – Tomalak

+0

J'ai essayé http://github.com/joestump/python-simplexml/blob/master/simplexml.py mais s'il n'y a qu'un seul item il ne va pas itérer juste finit dans une boucle sans fin – Mike

Répondre

6

-je utiliser personnellement xml.etree.cElementTree, comme je l'ai trouvé ça fonctionne vraiment bien, il est rapide, easy to use et works well with big (>2GB) files.

import xml.etree.cElementTree as etree 

with open(xml_file_path) as xml_file: 
    tree = etree.iterparse(xml_file) 
    for items in tree: 
     for item in items: 
      print item.text 

Dans la console interactive

>>> x="""<?xml version="1.0"?> 
<test> 
    <items> 
     <item>item 1</item> 
     <item>item 2</item> 
    </items> 
</test>""" 
>>> x 
'<?xml version="1.0"?>\n<test>\n <items>\n  <item>item 1</item>\n  <item>item 2</item>\n </items>\n</test>' 
>>> import xml.etree.cElementTree as etree 
>>> tree = etree.fromstring(x) 
>>> tree 
<Element 'test' at 0xb63ad248> 
>>> for i in tree: 
     for j in i: 
      print j 


<Element 'item' at 0xb63ad2f0> 
<Element 'item' at 0xb63ad338> 
>>> for i in tree: 
     for j in i: 
      j.text 

'item 1' 
'item 2' 
>>> 
+0

Le premier exemple ne marche pas. devrait être: '' 'avec open (xml_file_path) comme xml_file: arbre = etree.iterparse (xml_file) pour _, essai dans l'arbre: des articles test: pour produit en: print item.text' » ' – takoi

+0

cela lance minidom dans les boules .... 1000000000000x mieux – Brad

1

Essayez d'analyseur XML à partir du paquet xml.sax dans la bibliothèque standard.

 
from xml.sax import parse 
from xml.sax.handler import ContentHandler 
from sys import argv 

class Handler(ContentHandler): 
    def startElementNS(self, name, qname, attrs): 
     self.startElement(name, attrs) 

    def endElementNs(self, name, qname): 
     self.endElement(name, attrs) 

    def startElement(self, name, qname, attrs): 
     ... do whatever you like on tag start... 

    def characters(self, content): 
     ... on tag content ... 

    def endElement(self, name): 
     ... on tag closing ... 

if __name__ == "__main__": 
    parse(argv[1], Handler()) 

Ici, je suppose que argv [1] est un chemin vers le fichier que vous voulez analyser. (Le premier argument de la fonction parse() est filename ou stream). Il est facile de le convertir en boucle: saisissez toutes les informations dont vous avez besoin dans les méthodes ci-dessus et insérez-les dans une liste ou une pile. Itérer dessus une fois que vous avez fini d'analyser.

1
import xml.dom.minidom as md 

x='''<?xml version="1.0"?> 
<test> 
    <items> 
     <item>item 1</item> 
     <item>item 2</item> 
    </items> 
</test> 
''' 

xml=md.parseString(x) 

items=xml.getElementsByTagName("item") 
# [<DOM Element: item at 0xc16e40>, <DOM Element: item at 0xc16ee0>] 

depuis items est un tableau élément DOM, vous pouvez boucle avec for

0

Vous aimeriez probablement utiliser quelque chose comme ElementTree C'est une bibliothèque bien reconnue, je n'ai pas personnellement utilisé mais j'entends toujours de bonnes choses.

Aussi à partir de python 2.5 cela fait partie de la bibliothèque standard

Questions connexes