好的,我有一个案例,我需要在给定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>
我想为这两个资产添加<missions>
标记。但是,第二个资产缺少我要添加的父<services>
标记。每个资产标签都存储在一个变量中(比如node1,node2)。
我有以下xpath:xpath1 = services/missions
,由于我的程序工作方式,我不能简单地以不同的形式存储(即我没有地方存储services
)
我需要检查并查看任务标签是否已经存在,如果是,则不执行任何操作。如果标签不存在,我需要创建它。如果它的父级不存在,我也需要创建它。
如何使用xpath字符串完成此操作?
编辑:我希望将所有这些都基于一个布尔值:即val = true,然后根据需要创建标签(和父级)。如果为false,则删除标记。
(我没有别的方式来引用我需要的标签(因为我在大量的功能层上有图层来自动化这个过程,你可以在这里查看我之前的问题Python Lxml: Adding and deleting tags))。
编辑编辑:另一个问题:
我没有包含要添加的元素的父元素的变量,只是包含<asset>
对象的变量。我试图使用xpath和一个指向`标签的变量。
编辑编辑编辑:别介意以上内容,我将通过将xpath缩短为指向父级来解决问题,并使用变量名称来引用每个项目。
答案 0 :(得分:2)
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)
虽然我不确定组合添加&amp;删除1功能中的功能是个好主意,但无论如何这可能会像你期望的那样工作。