【问题标题】:How to etree findall() on many levels如何在多个级别上 etree findall()
【发布时间】:2021-07-01 22:31:42
【问题描述】:

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

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

在有人尝试添加“插件标签”之前,这非常有效。之后(即使它已被删除),该元素将被包裹在具有id 属性的<object> 中,但sourcetarget 属性保留在一个子节点中,如下所示:

之前:

<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 元素 id 的:

list_of_objects_elements = root.findall(root_node,".//*[@source][@target]/..")

但是我怎样才能从list_of_objects_elements 访问mxCell 元素,这样我才能得到sourcetarget 的id?

【问题讨论】:

    标签: python-3.x findall xml.etree draw.io


    【解决方案1】:

    我自己找到了解决办法。

    在 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 路径:

    这会在 &lt;mxCells&gt; 中搜索源和目标,同时从根传递回下一个更高的元素 &lt;object&gt;

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

    ./*[@source][@target]

    虽然在比&lt;object&gt; 更深的一个元素中搜索源和目标的下层

    对我来说,这些路径仍然是一个心灵打击。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 2011-09-24
      • 1970-01-01
      相关资源
      最近更新 更多