问题描述
我尝试操作一个未压缩的 XML 导出绘图的 diagrams.net(以前称为 draw.io)。
电缆可以连接到元素,我想得到一个电缆列表。
我通过测试元素是否具有 source
和 target
属性来搜索所有电缆。然后我将两者的 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
适用于格式化为查找 id
、source
和 target
元素的普通 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
元素,以便获得 target
和 id=("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。