2015-09-04 127 views
2

我有一個相當簡單的XML結構,它具有一定的可變性,所以我想簡化爲它編寫解析器。眼下XML類似於此:從Python minidom獲取標記列表XML

<items> 
    <item> 
     <Tag1>Some Value</Tag1> 
     <Tag2>Some Value</Tag1> 
     <Tag3>Some Value</Tag1> 
    </item> 
</items> 

我已經想通了如何正確地得到「一些價值」出來的標籤,進入我的數據字典,但我不一定知道所有的標籤可能會或可能不會在場。我想遍歷項目類中的所有內容,並將該標記作爲值來獲取,並且該值是一個單獨的值。

現在我的代碼如下所示:

from xml.dom import minidom 
from collections import defaultdict 

project = defaultdict(list) 

xml_file = minidom.parse(sys.argv[1]) 


for value in xml_file.getElementsByTagName("Tag1"): 
    project['Tag1'].append(xml_file.getElementsByTagName("Tag1")[0].firstChild.data) 
for value in xml_file.getElementsByTagName("Tag2"): 
    project['Tag2'].append(xml_file.getElementsByTagName("Tag2")[0].firstChild.data) 

print project.items() 

的原因「爲價值」的循環,是因爲我可能在這方面的標籤多次,我希望所有的人。我很想有像

for tag in item: 
    for value in xml_file.getElementsByTagName(tag): 
     project[tag].append(xml_file.getElementsByTagName(tag)[0].firstChild.data) 

這樣,如果我有40個不同的標籤我一個)沒有寫80行代碼(懶惰)和b)可以在翻譯如果處理動態輸出XML將在未來添加/減少標籤,因爲我不控制源,但我知道它有什麼能力。

回答

3

是的,你可以採取標籤從列表或其他來源搜索。當你這樣做 -

xml_file.getElementsByTagName(tag) 

的Python只是想tag是一個字符串,它並沒有成爲一個直接的文字串,你可以從文件中讀取的字符串和存儲在列表中,或者直接存儲在一個列表,或從其他來源獲得。

另外,還有一件事,你得到的值添加到project[tag]的方式是錯誤的,它總是隻會添加第一個元素的值。你應該這樣做 - value.firstChild.data來獲得價值。示例 -

items = ['Tag1','Tag2'] 
for tag in items: 
    for value in xml_file.getElementsByTagName(tag): 
     project[tag].append(value.firstChild.data) 

如果你想要的是讓所有元素節點內item,不知道該標記名事前,然後從xml.domElement對象有一個屬性tagName獲得該元素的標籤。您可以使用類似下面 -

from xml.dom.minidom import Node 
for elem in root.getElementsByTagName('item'): 
    for x in elem.childNodes: 
     if x.nodeType == Node.ELEMENT_NODE: 
      project[x.tagName].append(x.firstChild.data) 

示例/演示 -

>>> import xml.dom.minidom as md 
>>> s = """<items> 
...  <item> 
...   <Tag1>Some Value</Tag1> 
...   <Tag2>Some Value</Tag1> 
...   <Tag3>Some Value</Tag1> 
...  </item> 
... </items>""" 
>>> root = md.parseString(s) 
>>> from xml.dom.minidom import Node 
>>> for elem in root.getElementsByTagName('item'): 
...  for x in elem.childNodes: 
...    if x.nodeType == Node.ELEMENT_NODE: 
...      print(x.tagName, x.childNodes[0].data) 
... 
Tag1 Some Value 
Tag2 Some Value 
Tag3 Some Value 
+0

我理解第一部分 - 我的問題是如何我是否爲那些字符串掃描那棵樹?我不知道「Tag1」或「Tag2」是什麼,但我知道他們將採用這種格式,並且在項目樹 – szumlins

+0

中您想要所有標籤嗎?這還包括'items' /'item', –

+0

或者你已經知道'item'標籤了,你只想考慮它的孩子嗎? –