微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在多个级别上 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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。