python - 如何递归地遍历 xml 文件并访问子节点/元素并使用 Python 存储它们的数据?
问题描述
我有一个如下所示的 XML 文件。现在我需要访问port->name
, port->wire->direction
, port->wire->driver->defval
. XML 文件非常大。
我该如何处理?
<spirit:Bus>
<spirit:Ports>
<spirit:port>
<spirit:name>ABCPORT</spirit:name>
<spirit:description>SOME DESCRIPTION</spirit:description>
<spirit:wire>
<spirit:direction>INPUT</spirit:direction>
<spirit:driver>
<spirit:defaultValue>0</spirit:defaultValue>
</spirit:driver>
</spirit:wire>
</spirit:port>
<spirit:port>
<spirit:name>PQRPORT</spirit:name>
<spirit:description>SOME DESCRIPTION</spirit:description>
<spirit:wire>
<spirit:direction>OUTPUT</spirit:direction>
</spirit:wire>
</spirit:port>
</spirit:ports>
</spirit:Bus>
解决方案
为了正确格式化 XML,我将命名空间添加到您的示例中:
<spirit:Bus xmlns:spirit="http://dummy.com">
...
</spirit:Bus>
但是Bus仍然是根节点,就像您的示例一样。当然,您可以将给定的 URL 更改为您想要的任何内容。
要仅在ElementTree中完成任务,您可以使用以下代码:
import xml.etree.ElementTree as et
tree = et.parse('Input.xml')
root = tree.getroot()
ns = {'spirit': 'http://dummy.com'}
for nd in root.findall('spirit:Ports/spirit:port', ns):
print(nd.tag.split('}')[1], nd.findtext('spirit:name', namespaces=ns),
nd.findtext('spirit:wire/spirit:direction', namespaces=ns),
nd.findtext('spirit:wire/spirit:driver/spirit:defaultValue', namespaces=ns))
请注意,您的 XML 包含命名空间规范,因此您还必须在代码中指定它。
我的代码还显示了如何获取节点的本地名称(没有命名空间)。
结果,对于您的样本是:
port ABCPORT INPUT 0
port PQRPORT OUTPUT None
推荐阅读
- hibernate - 无法在休眠 5 中反序列化在休眠 3 中序列化的 blob
- arrays - 将数据传递到 SUMPRODUCT
- python - 我如何将特定列中的所有值相加到当前行
- postgresql - Hibernate 和 PostgreSQL:REPEATABLE_READ 和使用@Version 注解来避免写入倾斜和其他现象
- kubernetes - 为什么使用具有所需权限的服务帐户运行的 pod 无法列出 pod?
- react-native - 应用名称在 iOS 上显示为 __RN_CONFIG_DISPLAY_NAME
- python - 如何使用美丽的汤4渲染内联元素
- flutter - 使圆形头像显示在屏幕顶部
- yaml - 我的 GitHub 操作中嵌入式 shell 脚本的 YAML 语法有什么问题?
- .net - 为什么 SrCnn 的异常检测有两种方法 | DetectEntireAnomalyBySrCnn & DetectAnomalyBySrCnn?