Python XML в словарь для перебора элементов - PullRequest
4 голосов
/ 03 марта 2010

У меня есть следующий пример XML

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

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

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

Ответы [ 4 ]

6 голосов
/ 03 марта 2010

Я лично использую xml.etree.cElementTree, так как я обнаружил, что он работает действительно хорошо, он быстрый, простой в использовании , а хорошо работает с большими (> 2 ГБ ) файлы .

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'
>>>
1 голос
/ 03 марта 2010
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

1 голос
/ 03 марта 2010

Попробуйте парсер xml из пакета 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 () - это имя файла или поток). Его легко преобразовать в цикл for: просто соберите всю необходимую информацию в описанных выше методах и поместите их в какой-либо список или стек. Переберите его, как только закончите анализ.

0 голосов
/ 03 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...