2010-03-03 2 views
4

Я следующий пример XMLPython XML в словарь для перебора элементов

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

мне нужно перебрать каждого тега в цикле в питона. Если пробовал много вещей, но я просто не могу получить его ..

спасибо за помощь

+0

Пожалуйста, покажите некоторые из вещей, которые вы пробовали. – Tomalak

+0

Я пробовал http://github.com/joestump/python-simplexml/blob/master/simplexml.py, но если есть только 1 элемент, он не будет перебирать только концы в бесконечном цикле – Mike

ответ

6

Я лично использую xml.etree.cElementTree, как я нашел, что это работает очень хорошо, это быстро, easy to use и 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 

В интерактивной консоли

>>> 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

Первый пример не работает. должно быть: '' 'с открытым (xml_file_path), как xml_file: дерево = etree.iterparse (xml_file) для _, тест в дереве: элементов в тесте: для пункта в пунктах: печать item.text'» ' – takoi

+0

этот пинок мини-бала в шарах .... 1000000000000x лучше – Brad

1

Try XML Parser из xml.sax пакета в стандартной библиотеке.

 
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()) 

Здесь я предположил, что argv [1] - это путь к файлу, который вы хотите проанализировать. (первый аргумент функции parse() - имя файла или поток). Легко преобразовать его в цикл: просто возьмите всю необходимую информацию в вышеприведенных методах и вставьте их в некоторый список или стек. Итерации над ним, как только вы закончите синтаксический анализ.

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>] 

поскольку items является DOM элемент массива, вы могли бы петля с for

0

Вы, вероятно, хотели бы использовать что-то вроде ElementTree Это хорошо известная библиотека, я лично не использовал его, но я всегда слышал хорошие вещи.

Также, как и python 2.5, это часть стандартной библиотеки

Смежные вопросы