我正在使用 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
。
您可以使用
getchildren()
获取所有子项,并使用 addnext()
将然后(加一个)放在容器后面,然后删除(已准备好的)空容器
parent = container.getparent()
for child in container.getchildren():
container.addnext(child)
parent.remove(container)