【发布时间】:2021-08-05 10:27:30
【问题描述】:
我有以下 xml 文件,我需要到达特定块并更改 2 个属性值。
xml 文件 - https://alvinalexander.com/java/jwarehouse/activemq/assembly/src/release/conf/jetty.xml.shtml
我在本地有。
我需要编辑的块:
<bean class="org.eclipse.jetty.webapp.WebAppContext">
<property name="contextPath" value="/admin" />
<property name="resourceBase" value="${activemq.home}/webapps/admin" />
<property name="logUrlOnStart" value="true" />
</bean>
我需要更改属性<property name="contextPath" value="/admin" />的值
和
<property name="resourceBase" value="${activemq.home}/webapps/admin" />
到
<property name="contextPath" value="/hawtio" />
和
<property name="resourceBase" value="${activemq.home}/webapps/hawtio" />
我也需要不使用索引来做,我需要使用 xpath 来做。
这意味着,我希望使用 xpath 来访问特定元素并更改其属性 不使用(例如)树[i]
我的 python 代码(或至少我期望做的)
import lxml
from lxml import etree
#Initialise xml file , xml file has namespaces
tree = etree.parse("jetty.xml")
myroot = tree.getroot()
#XML File has atleast 5 childs to each element
#From here i expect to edit attributes without using
#Manual indexing , for example
#prop = myroot.find('property[@name="contextPath"]')
#prop.attrib['value'] = '/hawtio'
#prop = myroot.find(('./property[@name="resourceBase"]'))
#prop.attrib['value'] = "${activemq.home}/webapps/hawtio"
#etree.write("jetty.xml", pretty_print=True)
再次,我正在解析一个包含命名空间和许多子元素的文件,运行 find() 返回 None 并运行 findall()
返回一个空列表,使用命名空间运行这些选项也返回空列表 \None
进一步说明 - 打开一个 xml 文件,找到特定元素并编辑它们的属性 NO MATTER 其索引(例如 myroot[0][2])并将更改写回文件。
干杯,
【问题讨论】:
-
到目前为止你尝试了什么?
-
我跑了 print(tree.find("{springframework.org/schema/beans}bean[7]/{springframework.org/schema/beans}property/{springframework.org/schema/beans}list/{springframework.org/schema/beans}bean[1] /{springframework.org/schema/beans}property[1]")) 但它在 0x 处打印 Element ....,我需要完整路径,例如 /path/to/element ,以便将其保存在变量中然后运行.set() 来改变它的属性值。