在lxml中查找子项的索引

问题描述 投票:0回答:1

我正在使用 Python 3.12 和 lxml。

我想找到一个特定的标签,我可以使用 elem.find("tag") 来完成。 elem 是 Element 类型。

但是我想将这个孩子的子元素移动到孩子所在的父元素中。为此,我需要孩子的索引。我找不到找到该索引的方法。

lxml 的 API 描述有 _Element.index() 方法,但我不知道如何从 Element 实例获取 _Element 实例。

请告知如何确定该指数。 (使用循环而不是 find() 可以做到这一点,但我想要一种更简洁的方法)。

编辑:这是一个示例 XML 元素

<parent>
  <child-a/>
  <container>
     <child-b/>
     <child-c/>
  </container>
  <child-d/>
  <child-e/>
</parent>

我正在编写代码,查找 ,它是 的子级,但我事先不知道它的位置(也可以有多个),并将其子级移动到它所在的父级,然后删除 ,以获得这个:

<parent>
  <child-a/>
  <child-b/>
  <child-c/>
  <child-d/>
  <child-e/>
</parent>

所以,我可以使用

<container>
找到
parent.find()
。但是要将其子项移动到
<parent>
下的同一位置,我需要具有
<container>
的索引,因为
insert()
方法需要索引。现在我用这个拼凑:

    while True:
        index = None
        found = None
        for i in range(len(parent)):
            if parent[i].tag =="container":
                found = parent[i]
                index = i
                break
        if found is None:
            break

        offset = 0
        while len(found) > 0:
            parent.insert(index+offset,found[0])
            offset+=1
        parent.remove(found)

我确实知道

offset
是多余的,因为人们可以增加
index
,我这样做是出于审美原因。但循环本身是相当混乱的。如果
Element
index()
方法,我会这样做,但它没有:

    found = parent.find("container")
    while found:
        index = parent.index(found)
        offset = 0
        while len(found) > 0:
            parent.insert(index+offset,found[0])
            offset+=1
        parent.remove(found)
        found = parent.find("container")

但是

Element.index()
不存在;
_Element.index()
存在,但我不知道如何访问
_Element

python python-3.x xml lxml
1个回答
0
投票

您可以使用

getchildren()
获取所有子项,并使用
addnext()
将然后(加一个)放在容器后面,然后删除(已准备好的)空容器

parent = container.getparent()

for child in container.getchildren():
    container.addnext(child)

parent.remove(container)    
© www.soinside.com 2019 - 2024. All rights reserved.