我有一个相当简单的 XML 结构,具有一定程度的可变性,因此我想简化为其编写解析器。现在 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 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 将来像我一样添加/减去标签,则可以在翻译器中处理动态输出无法控制来源,但我知道它的能力。
最佳答案
是的,您可以从列表或其他来源中获取标签进行搜索。当你这样做时 -
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,则使用 xml.dom
中的 Element
对象有一个属性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
关于python - 从 Python minidom XML 获取标签列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32387528/