python - 如何打印 lxml 树元素的 XPath?
问题描述
我正在尝试打印 XML 树中所有元素的 XPath,但是在使用 lxml 时我得到了奇怪的输出。我得到的不是包含路径中每个节点名称的 xpath,而是奇怪的“*”类型的输出。你知道这里可能是什么问题吗?这里的代码,以及我试图分析的 XML。
from lxml import etree
xml = """
<filter xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<bundles xmlns="http://cisco.com/ns/yang/Cisco-IOS-XR-bundlemgr-oper">
<bundles>
<bundle>
<data>
<bundle-status/>
<lacp-status/>
<minimum-active-links/>
<ipv4bfd-status/>
<active-member-count/>
<active-member-configured/>
</data>
<members>
<member>
<member-interface/>
<interface-name/>
<member-mux-data>
<member-state/>
</member-mux-data>
</member>
</members>
<bundle-interface>{{bundle_name}}</bundle-interface>
</bundle>
</bundles>
</bundles>
<bfd xmlns="http://cisco.com/ns/yang/Cisco-IOS-XR-ip-bfd-oper">
<session-briefs>
<session-brief>
<state/>
<interface-name>{{bundle_name}}</interface-name>
</session-brief>
</session-briefs>
</bfd>
</filter>
"""
root = etree.XML(xml)
tree = etree.ElementTree(root)
for element in root.iter():
print(tree.getpath(element))
输出看起来像这样(应该有节点名称而不是“*”):
/*
/*/*[1]
/*/*[1]/*
/*/*[1]/*/*
/*/*[1]/*/*/*[1]
/*/*[1]/*/*/*[1]/*[1]
/*/*[1]/*/*/*[1]/*[2]
/*/*[1]/*/*/*[1]/*[3]
/*/*[1]/*/*/*[1]/*[4]
/*/*[1]/*/*/*[1]/*[5]
/*/*[1]/*/*/*[1]/*[6]
/*/*[1]/*/*/*[2]
/*/*[1]/*/*/*[2]/*
/*/*[1]/*/*/*[2]/*/*[1]
/*/*[1]/*/*/*[2]/*/*[2]
/*/*[1]/*/*/*[2]/*/*[3]
/*/*[1]/*/*/*[2]/*/*[3]/*
/*/*[1]/*/*/*[3]
/*/*[2]
/*/*[2]/*
/*/*[2]/*/*
/*/*[2]/*/*/*[1]
/*/*[2]/*/*/*[2]
非常感谢!德拉甘
解决方案
我发现除了getpath之外,etree还包含一个名为getelementpath的“兄弟”方法,它也为命名空间元素提供了正确的结果。
因此,将您的代码更改为:
for element in root.iter():
print(tree.getelementpath(element))
对于您的源示例,为了便于阅读,缩短了命名空间,结果的初始部分是:
.
{http://cisco.com/ns}bundles
{http://cisco.com/ns}bundles/{http://cisco.com/ns}bundles
推荐阅读
- reactjs - DOM 始终是每隔一个页面中的 App 页面 React + Ionic + Typescript
- node.js - 如何从我的 .env 文件中获取变量到 Azure 管道
- python - aiogram python中的复选框内联按钮
- android - Xamarin.Forms Android 模拟器没有连接
- c# - Serilog:使用子记录器和过滤器的多文件输出
- flutter - 如何汇总所有折扣集合,然后为另一个集合中的所有学生获取这些值的总和
- android - 如何在回收器视图中从基本类别创建更多类别
- javascript - 如果值存在,则 Firebase 更新实例
- sql - Oracle APEX 主详细信息页面创建:ORA-06531 错误
- python - 在谷歌应用引擎查询中返回缺失值