我有一个相当简单的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在将来添加/减去标签时可以处理翻译器中的动态输出控制源,但我知道它的能力。
答案 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)