【问题标题】:Displace elements in ElementTree (nest an element into a parallel element)置换 ElementTree 中的元素(将元素嵌套到并行元素中)
【发布时间】:2017-06-16 05:46:15
【问题描述】:

我试图将几个(现有的)XML 元素 放入一个并行元素 ,因此

<root>
    <a/>
    <b id="one"/>
    <b id="two"/>
</root>

变成

<root>
    <a>
        <b id="one"/>
        <b id="two"/>
    </a>
</root>

我试过这个:

findingA = root.find('a')
for b in root.findall('root/b'):
    findingA.append(b)
    root.remove(b)

但是这些该死的 不会移动,无论是 findall 还是 iter。

【问题讨论】:

    标签: python xml elementtree


    【解决方案1】:

    root.findall() 从 'root' 开始,试试这个:

    findingA = root.find('a')
    for b in root.findall('b'):
        findingA.append(b)
        root.remove(b)
    

    【讨论】:

    • 什么版本的lxml 正在运行?我得到“ValueError:元素不是这个节点的子节点。”有了这个。
    • 我在使用 lxml 时也遇到了这个错误。但是这个问题被标记为“elementtree”,而不是“lxml”,所以假设 OP 没有使用 lxml 似乎是合理的。
    • @mzjn 我们不是在谈论 lxml.etree 吗?
    • 看来@LancelodLiu 使用 ElementTree (docs.python.org/2/library/xml.etree.elementtree.html) 而您 (@mwil.me) 使用 lxml (lxml.de)。这些 API 非常相似,但有时它们的行为不同。
    • 我的问题是基于:import xml.etree.ElementTree as ET mwil.me 和 Lancelod Liu 的解决方案都有效。 1. 追加行复制 a 中的 b 元素。然后我在树中有两次 b 元素。 2. remove 行将原始 b 元素作为根的直接子元素删除。 a 的新创建的 b-children。我最初的设置是我刚刚在上面几行的树中创建了包装器元素 a 并且我收到了如下错误:AttributeError: 'NoneType' object has no attribute 'append'。所以我将不得不检查我的工作流程。感谢您的努力!
    【解决方案2】:

    您正在&lt;root&gt; 元素下方搜索,但您使用的路径“root/b”不匹配。 for 循环得到一个空列表并且什么也不做。


    编辑:此解决方案仅适用于 lxml 中的 ElementTree 实现,移动行为不适用于其他情况,请参阅该情况下的其他答案。

    在lxml中,你不必删除元素b,追加不会复制元素。

    fA = root.find("a")
    for b in root.findall("b"):
        fA.append(b)
    

    【讨论】:

    • 如果不删除b,输出树就不会正确。
    • @LancelodLiu 你真的试过这个吗?附加到其他地方会为我移动元素。
    • 感谢 mwil.me。请在 Lancelod 的回答下查看我的评论。您的代码运行良好,但它两次留下 b 元素(一次作为直接子元素,然后作为 a 内的副本)。 root.remove(b) 行运行良好,只删除了原来的 b 元素。
    • @Helen Strange,对我来说没有副本,它会移动元素。我正在使用 Python3 和 lxml v3.7.3
    • 我现在已经在我的真实环境中构建了解决方案(包括编写一个真实的 xml 文件)——它可以工作。当我注释掉删除行时,子元素 b 作为根的直接子元素保持在其原始位置,并且它的克隆出现在包装器中。查看规范: append(subelement) 将元素子元素添加到该元素的内部子元素列表的末尾。无论如何,我将“添加”解释为复制,否则它会使用另一个词。似乎ET根本无法移动。甚至插入功能也给了我一份副本。
    猜你喜欢
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多