2012-01-11 92 views
1

我希望從多用途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的,並可以成功提取根標籤,並可以通過引用標記名稱中提取值,但沒有引用一個一直沒能找到一種方法來簡單地遍歷標籤和數據標籤名。

任何幫助將是偉大的。

謝謝。

回答

4
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

0

這可以通過使用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

1

你可以使用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

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