Python将XML转换为字典以便迭代项
我有一个这样的XML示例
<?xml version="1.0"?>
<test>
<items>
<item>item 1</item>
<item>item 2</item>
</items>
</test>
我想在Python中用for循环遍历每一个标签。我试了很多方法,但就是搞不定……
谢谢大家的帮助
4 个回答
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
循环来遍历它。
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() 函数的第一个参数是文件名或数据流)。把它改成 for 循环也很简单:只需在上面的函数中获取你需要的所有信息,然后把它们放进一个列表或栈里。等你解析完后,再遍历这个列表或栈。
7
我个人使用的是 xml.etree.cElementTree
,因为我发现它运行得非常好,速度快,使用起来也很简单,而且对于大文件(超过2GB)也能很好地处理。
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'
>>>