2015-09-04 74 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'标签了,你只想考虑它的孩子吗? –