【发布时间】:2019-04-30 12:55:31
【问题描述】:
我正在尝试使用 Python 的 ElementTree 来解析和修改 xml 文件。 XML 命名空间带来了混乱。我可以使用 findall 和 finditer 来获取所有服务器名称。但是,我无法让 xpath 查询找到特定的服务器。相反,find 只是带回了父元素。
我需要做的是通过“名称”或“机器”元素找到正确的服务器并修改“参数”。
<? xml version=’1.0’ encoding=’UTF-8’?>
<domain xmlns=”http://xmlns.oracle.com.weblogic/domain”>
<server>
<name>Server1-rma</name>
<machine>server1</machine>
<server-start>
<arguments> -Xms4g</arguments>
</server-start>
</server>
<server>
<name>Server2-rma</name>
<machine>server2</machine>
<server-start>
<arguments> -Xms4g</arguments>
</server-start>
</server>
<server>
<name>Server3-rma</name>
<machine>server3</machine>
<server-start>
<arguments> -Xms4g</arguments>
</server-start>
</server>
</domain>
我尝试了查询的各种迭代。但是,我是 XPath 的新手,一定是做错了什么:
失败:
root + “ns0:server/[ns0:machine=’server2’]
失败:
root + “ns0:server/ns0:[machine=’server2’]
失败:
root + “ns0:server/[ns0:machine=ns0:’server2’]
示例代码:
import xml.etree.ElementTree as ET
namespace = {‘ns0’: ‘ http://xmlns.oracle.com.weblogic/domain’}
tree = ET.parse(‘config.xml’)
root = tree.getroot()
for item in root.find((root + “ns0:server/[ns0:machine=’server2’]), namespace)
print(item.tag)
output:
{http://xmlns.oracle.com.weblogic/domain}server
我希望能够匹配“机器”元素并拉出父元素以访问正确的“参数”元素。
我是 xpath 和 elementtree 的初学者,所以我很肯定,我只是做错了事。我只是不确定是什么。任何帮助将不胜感激。
【问题讨论】:
-
正确的 XPath 表达式是
/ns0:domain/ns0:server[ns0:machine='server2']。 谓词是同一位置步骤的一部分。另外,请注意ElementTree来自xml.etree模块有 limited support for XPath 1.0 -
感谢您的回复和信息。
标签: python xml xpath xml-namespaces elementtree