使用python解析未知元素的xml文件ElementTree
问题描述:
我希望从多用途xml文件中提取所有标签名称及其相应的数据。然后将该信息保存到Python字典中(例如tag = key,data = value)。标签名称和数值的未知数量是未知的。使用python解析未知元素的xml文件ElementTree
<some_root_name>
<tag_x>bubbles</tag_x>
<tag_y>car</tag_y>
<tag...>42</tag...>
</some_root_name>
我使用ElementTree的,并可以成功提取根标签,并可以通过引用标记名称中提取值,但没有引用一个一直没能找到一种方法来简单地遍历标签和数据标签名。
任何帮助将是伟大的。
谢谢。
答
from lxml import etree as ET
xmlString = """
<some_root_name>
<tag_x>bubbles</tag_x>
<tag_y>car</tag_y>
<tag...>42</tag...>
</some_root_name> """
document = ET.fromstring(xmlString)
for elementtag in document.getiterator():
print "elementtag name:", elementtag.tag
编辑: 从文件而不是从字符串
document = ET.parse("myxmlfile.xml")
答
这可以通过使用LXML在Python
from lxml import etree
myxml = """
<root>
value
</root> """
doc = etree.XML(myxml)
d = {}
for element in doc.iter():
key = element.tag
value = element.text
d[key] = value
print d
答
你可以使用xml.sax.handler解析XML来实现:
import xml.sax as sax
import xml.sax.handler as saxhandler
import pprint
class TagParser(saxhandler.ContentHandler):
# http://docs.python.org/library/xml.sax.handler.html#contenthandler-objects
def __init__(self):
self.tags = {}
def startElement(self, name, attrs):
self.tag = name
def endElement(self, name):
if self.tag:
self.tags[self.tag] = self.data
self.tag = None
self.data = None
def characters(self, content):
self.data = content
parser = TagParser()
src = '''\
<some_root_name>
<tag_x>bubbles</tag_x>
<tag_y>car</tag_y>
<tag...>42</tag...>
</some_root_name>'''
sax.parseString(src, parser)
pprint.pprint(parser.tags)
产量
{u'tag...': u'42', u'tag_x': u'bubbles', u'tag_y': u'car'}
答
>>> import xml.etree.cElementTree as et
>>> xml = """
... <some_root_name>
... <tag_x>bubbles</tag_x>
... <tag_y>car</tag_y>
... <tag...>42</tag...>
... </some_root_name>
... """
>>> doc = et.fromstring(xml)
>>> print dict((el.tag, el.text) for el in doc)
{'tag_x': 'bubbles', 'tag_y': 'car', 'tag...': '42'}
阅读如果你真的想42
而不是'42'
,你需要更加努力一点,少典雅。
+0
谢谢,我实际上可以管理那一个:) – Markus 2012-01-11 12:16:15
感谢您的回复,这应该很好。我正在使用.xml文件(不是xml字符串)。在迭代它之前,我需要将文件转换为字符串吗?如果是这样,你能告诉我该怎么做吗? StringIO的?再次感谢。 – Markus 2012-01-11 11:09:00
我在上面添加了一个例子。 – Kristofer 2012-01-11 11:21:41
'from xml.etree'应该是'from lxml.etree',不是吗? – 2012-01-11 11:24:54