如何在多个级别上 etree findall()

问题描述

我尝试操作一个未压缩的 XML 导出绘图的 diagrams.net(以前称为 draw.io)。

电缆可以连接到元素,我想得到一个电缆列表。 我通过测试元素是否具有 sourcetarget 属性搜索所有电缆。然后我将两者的 id's 与元素的完整列表进行比较,以找到 value 中的连接标签

这很好用,直到有人尝试添加插件标签”。在那之后(即使它被删除),元素被包裹在一个 <object> 中,该 id 具有 source 属性,但 target<mxCell id="ferXMembXyNwfAPwV5vA-22" value="" style="..endless list" edge="1" parent="1" source="ferXMembXyNwfAPwV5vA-8" target="ferXMembXyNwfAPwV5vA-18"> <mxGeometry relative="1" as="geometry"> <mxPoint x="540" y="520" as="sourcePoint" /> <mxPoint x="700" y="520" as="targetPoint" /> </mxGeometry> </mxCell> 属性保留在一个名为这个:

之前:

<object label="" id="ferXMembXyNwfAPwV5vA-53">
  <mxCell style="..endless long list" edge="1" parent="1" source="ferXMembXyNwfAPwV5vA-42" target="ferXMembXyNwfAPwV5vA-51">
    <mxGeometry relative="1" as="geometry">
      <mxPoint x="660" y="340" as="sourcePoint" />
      <mxPoint x="770" y="360" as="targetPoint" />
    </mxGeometry>
  </mxCell>
</object>

之后:

findall

mxCell 适用于格式化为查找 idsourcetarget 元素的普通 list_of_mxCell_elements = root.findall(root_node,".//*[@source][@target]")

objects

这对于 list_of_objects_elements = root.findall(root_node,".//*[@source][@target]/..") 元素 ID:

mxCell

但是我怎样才能从 list_of_objects_elements 访问 source 元素,以便获得 targetid=("6",) statement1 = "select * from posts where id = 6" statement2 = "select * from posts where id = ?" db.cursor.execute(statement1) result = db.cursor.fetchall() for x in result: print(x) db.cursor.execute(statement2,id) result = db.cursor.fetchall() for x in result: print(x) id?

解决方法

我自己找到了解决方案。

在 findall 'elements' 之后,我遍历元素列表,然后对我得到的每个电缆元素再做一次 findall。

看起来有点像这样:

list_of_objects_elements = root.findall(root_node,'.//*[@source][@target]/..')
for cable in list_of_objects_elements:
    for mxCell in cable.findall('./*[@source][@target]'):

注意稍微不同的 findall 路径:

这会在 <mxCells> 中搜索源和目标,同时从根传回下一个更高的元素 <object>

.//*[@source][@target]/..

./*[@source][@target]

而较低的搜索源和目标仅在比 <object> 深的一个元素中搜索

对我来说,这些路径仍然是一个Mindblow。