【发布时间】:2018-01-08 18:08:07
【问题描述】:
我正在使用 minidom 检查包含调试键列表的 XML。 XML 示例如下:
<Shortcuts>
<Item>
<CommandName>DebugCommandName_1</CommandName>
<ShortcutKeys>
<Item>
<Keys>
<Item>KEY_1</Item>
<Item>KEY_2</Item>
</Keys>
</Item>
</ShortcutKeys>
</Item>
...
<Item>
<CommandName>DebugCommandName_2</CommandName>
<ShortcutKeys>
<Item>
<Keys>
<Item>KEY_3</Item>
</Keys>
</Item>
<Item>
<Keys>
<Item>KEY_4</Item>
</Keys>
</Item>
</ShortcutKeys>
</Item>
</Shortcuts>
由于我无法控制的原因,我将无法要求将传入 XML 的格式更改为更加一致,因此我必须考虑文档的 ShortcutKeys 部分的布局以及多个 Item到处都是子元素。
用minidom解析XML,然后我用下面的Python来提取内容:
for item in parsedKeyComboFile.getElementsByTagName("Item"):
if (item.getElementsByTagName("CommandName").length > 0):
commandName = item.getElementsByTagName("CommandName")[0].childNodes[0].nodeValue
print(commandName)
elif (item.getElementsByTagName("Keys").length > 0):
keyCombo = item.getElementsByTagName("Item")[0].childNodes[0].nodeValue
print(keyCombo)
我最终会将此信息添加到字典中,但现在我得到的上述 XML 的打印结果是:
DebugCommandName_1
KEY_1
DebugCommandName_2
KEY_3
KEY_4
当我想要的是:
DebugCommandName_1
KEY_1 KEY_2
DebugCommandName_2
KEY_3 KEY_4
(我意识到我没有正确格式化键的打印以实现单行输出。这里的关键不是跳过 KEY_2 项。)
我知道 keyCombo= 行中的 [0] 将我限制为 Keys 中 Item 的第一次出现。
那么,有没有办法让我检查一个顶级 Item 及其所有子元素,提取该顶级 Item 中的单个 CommandName 和所有 Keys 项目,然后再进入下一个顶级项目并重复该过程?到目前为止,我完全没有做到这一点。
我应该使用 ElementTree 吗?
非常感谢。
【问题讨论】: