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

时间:2011-04-05 05:25:10

标签: python xpath add lxml

好的,我有一个案例,我需要在给定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缩短为指向父级来解决问题,并使用变量名称来引用每个项目。

1 个答案:

答案 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功能中的功能是个好主意,但无论如何这可能会像你期望的那样工作。