【问题标题】:How to handle adding elements and their parents using xpath如何使用 xpath 处理添加元素及其父元素
【发布时间】:2011-04-05 05:25:10
【问题描述】:

好的,我有一种情况,我需要将标签添加到给定 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>

我想为这两个资产添加一个&lt;missions&gt; 标签。但是,第二个资产缺少我要添加的父 &lt;services&gt; 标签。每个资产标签都存储在一个变量中(比如 node1、node2)。

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

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

我怎样才能简单地通过使用 xpath 字符串来做到这一点?

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

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

编辑编辑:另一个问题:

我没有包含要添加的元素的父级的变量,只有一个包含&lt;asset&gt; 对象的变量。我正在尝试使用 xpath 和指向 ` 标记的变量来获取我想要的节点的父节点。

Edit edit 编辑:不管上面的,我将通过缩短 xpath 指向父项,并使用变量名来引用每个项目来解决这个问题。

【问题讨论】:

    标签: python xpath add lxml


    【解决方案1】:
    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 个函数中组合添加和删除功能是个好主意,但无论如何这很可能会按您的预期工作。

    【讨论】:

    • 看起来这会起作用,但我更新了问题以包括删除(在您发布之后)。如果传递一个错误值,你能给我删除标签的选项吗?
    • 当然可以,但是删除的逻辑是什么,假设您指定了'x/y/z', false。这是什么意思 - 删除节点:zx
    • 这意味着删除 z(“最底部”节点)。
    • @Biosci3c - 我已经更新了代码,请检查是否有帮助
    • 谢谢,有机会我会试试的。我知道你在同一个函数中添加/删除功能是什么意思,但我想不出在我的项目方案中的另一种方法,因为我需要将此代码作为函数调用并让它处理案例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    相关资源
    最近更新 更多