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

好吧,我有一个案例,我需要在给定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功能中的功能是个好主意,但无论如何这可能会像你期望的那样工作.

点赞