Python XML to dictionary to iterate items

时间:2010-03-03 14:51:32

标签: python xml

我有以下XML示例

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

我需要迭代python中的for循环中的每个标记。如果尝试了很多东西,但我无法得到它..

感谢您的帮助

4 个答案:

答案 0 :(得分:6)

我个人使用xml.etree.cElementTree,因为我发现它效果很好,速度很快,easy to useworks 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'
>>>

答案 1 :(得分:1)

从标准库中的xml.sax包中尝试xml解析器。

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()函数的第一个参数是filename或stream)。很容易将它转换为for循环:只需获取上述方法中所需的所有信息,并将它们推入某个列表或堆栈。完成解析后迭代它。

答案 2 :(得分: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

循环

答案 3 :(得分:0)

你可能想要使用像ElementTree这样的东西。这是一个着名的图书馆,我没有亲自使用它,但我总是听到好东西。

从python 2.5开始,它也是标准库的一部分