gpt4 book ai didi

python - 如何使用 xpath 处理添加元素及其父元素

转载 作者:太空宇宙 更新时间:2023-11-03 11:35:16 24 4
gpt4 key购买 nike

好的,我有一个情况,我需要将一个标签添加到给定 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>标记到两个 Assets 。但是,第二个 Assets 缺少父项 <services>标签,我想添加。每个 Assets 标签都存储在一个变量中(比如 node1、node2)。

我有以下 xpath:xpath1 = services/missions ,由于我的程序的工作方式,我不能简单地以不同的形式存储(即我没有地方只存储 services )

我需要检查任务标签是否已经存在,如果存在,什么也不做。如果标签不存在,我需要创建它。如果它的父级不存在,我也需要创建它。

如何使用 xpath 字符串简单地做到这一点?

编辑:我想将所有这些都基于一个 bool 值:即 val = true,然后在必要时创建标签(和父标签)。如果为假,则删除标签。

(我没有其他方式来引用我需要的标签(因为我有一层又一层的函数来大规模地自动化这个过程,你可以在这里查看我之前的问题 Python Lxml: Adding and deleting tags ))。

编辑编辑:另一个问题:

我没有包含要添加元素的父元素的变量,只有一个包含 <asset> 的变量目的。我正在尝试使用 xpath 和指向 ` 标签的变量获取我想要的节点的父节点。

Edit edit edit:不用管上面的事,我会通过缩短 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 个函数中组合添加和删除功能是个好主意,但无论如何这很可能会如您所期望的那样工作。

关于python - 如何使用 xpath 处理添加元素及其父元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5547589/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com