2010-03-03 74 views
4

我有以下XML例子Python的XML到词典遍历项目

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

我需要遍历每个标签的在Python中循环。如果尝试了很多事情,但我不能得到它..

感谢您的帮助

+0

请显示您尝试过的一些事情。 – Tomalak 2010-03-03 14:54:05

+0

我已经尝试http://github.com/joestump/python-simplexml/blob/master/simplexml.py,但如果只有1个项目,它不会迭代只是无限循环结束 – Mike 2010-03-03 14:57:45

回答

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 2012-04-18 16:18:33

+0

这踢在BALLS .... ... 1000000000000x minidom更好 – Brad 2013-07-10 21:12:01

1

尝试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循环很容易:只需在上面的方法中获取所需的所有信息,并将它们推送到某个列表或堆栈中。一旦完成解析,迭代它。

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这是一个很好著名的图书馆,我没有亲自使用过,但我总是听到好东西。

也作为蟒蛇2.5它是标准库的一部分