python - 从 Python minidom XML 获取标签列表

标签 python xml

我有一个相当简单的 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/

相关文章:

java - 膨胀 fragment 时发现类未找到异常

java - 如何将集合包装在单个父标签中

xml - 用于选择具有未知值的属性的元素的 XPath 谓词

python - 捕捉任何东西并将其保存到变量中

python - 如何使用 `imageio` 在视频中寻找帧?

Python 管理存储库 Pycharm

python - python电报机器人中的回调查询处理程序问题

python - 在多列 pandas 上应用 "list"函数

python: xml.etree.elementtree.ElemenTtree.write() 声明标签

java - 将 xml 解析为 java 对象时没有单字符串构造函数/工厂方法错误