使用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") 
+0

感谢您的回复,这应该很好。我正在使用.xml文件(不是xml字符串)。在迭代它之前,我需要将文件转换为字符串吗?如果是这样,你能告诉我该怎么做吗? StringIO的?再次感谢。 – Markus 2012-01-11 11:09:00

+0

我在上面添加了一个例子。 – Kristofer 2012-01-11 11:21:41

+0

'from xml.etree'应该是'from lxml.etree',不是吗? – 2012-01-11 11:24:54

这可以通过使用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 
+0

另一个很好的答案,它看起来更紧凑,谢谢。我问过Kristofer的同一个问题,在使用iter之前,是否需要将XML文件转换为xml字符串?这很容易做到吗? – Markus 2012-01-11 11:12:41

+0

-1这不是一个好的答案。而不是'd = {key:value}',它应该有'd [key] = value'。 – 2012-01-11 12:02:51

+0

更改字典 – Nava 2012-01-11 14:05:19

你可以使用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'} 
+0

感谢您的回复,我不熟悉xml.sax。是否有可能获得更像{'tag_x:bubbles','tag_y:car','tag ...:42'}的输出? – Markus 2012-01-11 11:19:21

+0

@Markus:当然是。 unutbu没有正确地阅读你的问题。您应该能够将self.tags初始化为字典,并将self.tags.append行更改为您想要的内容。 – 2012-01-11 12:06:01

+0

@JohnMachin好吧,这很简单。谢谢你的答案约翰。 – Markus 2012-01-11 12:16:27

>>> 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