好吧,我有一个案例,我需要在给定xpath的情况下将标签添加到某个其他标签.
示例xml:
<?xml version="1.0" encoding="UTF-8"?>
<Assets>
<asset name="Adham">
<general>>
<services>
<land/>
<refuel/>
</services>
</general>
</asset>
<asset name="Test">
<general>
<Something/>
</general>
</asset>
</Assets>
我想添加一个< mission>标记到两个资产.但是,第二个资产缺少父< services>标签,我想添加.每个资产标签都存储在一个变量中(比如node1,node2).
我有以下xpath:xpath1 =服务/任务,由于我的程序的工作方式,我不能简单地以不同的形式存储(即我没有存储服务的地方)
我需要检查并查看任务标签是否已经存在,如果是,则不执行任何操作.如果标签不存在,我需要创建它.如果它的父节点不存在,我也需要创建它.
如何通过使用xpath字符串来完成此操作?
编辑:我想将所有这些都基于一个布尔值:即val = true,然后根据需要创建标签(和父级).如果为false,则删除标记.
(我没有其他方式来引用我需要的标签(因为我在大量的功能层上有层来自动化这个过程,你可以在这里查看我之前的问题Python Lxml: Adding and deleting tags)).
编辑编辑:另一个问题:
我没有包含要添加的元素的父元素的变量,只是包含< asset>的变量.宾语.我试图使用xpath和一个指向`标签的变量来获取我想要的节点的父节点.
编辑编辑编辑:别介意上面的内容,我将通过将xpath缩短为指向父级并使用变量名称来引用每个项目来解决问题.
解决方法:
def to_xml(parent, xpath, value):
"""
parent: lxml.etree.Element
xpath: string like 'x/y/z', anything more complex is likely to break
value: anything, if is False - means delete node
"""
# find the node to proceed further
nodes = parent.xpath(xpath)
if nodes:
node = nodes[0]
else:
parts = xpath.split('/')
p = parent
for part in parts:
nodes = p.xpath(part)
if not nodes:
n = etree.XML("<%s/>" % part)
p.append(n)
p = n
else:
p = nodes[0]
node = p
# do whatever is specified vy value
if value is False:
node.getparent().remove(node)
else:
node.text = str(value)
虽然我不确定组合添加&删除1功能中的功能是个好主意,但无论如何这可能会像你期望的那样工作.