从Python minidom XML获取标签列表

时间:2015-09-04 00:42:49

标签: python xml

我有一个相当简单的XML结构,它具有一定程度的可变性,所以我想简化为它编写解析器。现在xml看起来与此类似:

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

我已经想出如何从标签和我的数据字典中正确地获取“Some Value”,但我不一定知道所有可能存在或可能不存在的标签。我想迭代item类中的所有内容并将标记作为值获取,并将值作为单独的值。

现在我的代码看起来像这样:

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 value”循环的原因是因为我可能在此上下文中多次使用标记,而我想要所有这些标记。我喜欢有像

这样的东西
for tag in item:
    for value in xml_file.getElementsByTagName(tag):
        project[tag].append(xml_file.getElementsByTagName(tag)[0].firstChild.data)

这样,如果我有40个不同的标签我a)不必写80行代码(懒惰)和b)如果XML在将来添加/减去标签时可以处理翻译器中的动态输出控制源,但我知道它的能力。

2 个答案:

答案 0 :(得分: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内的所有元素节点,而不事先知道tagName,那么来自Element的{​​{1}}对象有一个属性xml.dom来获取该元素的标记。您可以使用以下内容 -

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)

答案 1 :(得分:0)

另一种方法是使用https://docs.python.org/2/library/xml.etree.elementtree.html#module-xml.etree.ElementTree

from xml.etree import ElementTree as ET

xml_tree = ET.fromstring(sys.argv[1])

for item in xml_tree:
    for t in item:
        #here t is s tag under item. You can have multiple tags
        project[t.tag].append(t.text)