Python:如何在特定位置复制和插入xml元素

时间:2019-05-28 14:32:58

标签: python xml xml.etree

我正在使用xml.etree.ElementTree解析XML文件。我现在想 复制特定的XML元素并将其插入我想要的目标位置。

XML文件的基本外观如下:

<file>
   <page id="1">
      <text id="1"> sample text </text>
      <text id="2"> sample text II </text>
   </page>
   <page id="2">
      <text id="1"> sample text copy</text>
      <text id="2"> sample text me </text>
   </page>
   <page id="3">
      <text id="1"> sample text hello </text>
      <text id="2"> sample text world </text>
   </page>
   <page id="4">
      <text id="1"> sample text game </text>
      <text id="2"> sample text over </text>
   </page>
</file>

例如,我要复制id =“ 2”的页面元素,并将其插入id =“ 3”的页面元素之后。另外,我想更改新元素的ID。

结果应如下所示:

<file>
   <page id="1">
      <text id="1"> sample text </text>
      <text id="2"> sample text II </text>
   </page>
   <page id="2">
      <text id="1"> sample text copy</text>
      <text id="2"> sample text me </text>
   </page>
   <page id="3">
      <text id="1"> sample text hello </text>
      <text id="2"> sample text world </text>
   </page>
   *<page id="2.1">
      <text id="1"> sample text copy</text>
      <text id="2"> sample text me </text>
   </page>*
   <page id="4">
      <text id="1"> sample text game </text>
      <text id="2"> sample text over </text>
   </page>
</file>

*插入的元素

我已经尝试了this的一些变体,但是我总是遇到属性问题(在这种情况下,为id)。 当前,我正在使用xml.etree.ElementTree,如果有人可以帮助我使用此软件包解决我的问题,那将是很好的选择,但是我会拿走所有能够解决问题的软件包。

1 个答案:

答案 0 :(得分:0)

要查找特定节点,请对某些XPath使用find()来获取id = 2的页面节点:

# Find element to copy
member1 = root.find(".//page[@id='2']")

# Create copy
member2 = copy.deepcopy(member1)

要更改id属性的值,请使用:

member2.set('id' , '2.1')

现在,您可以将新元素插入为第4个元素。为此,请使用插入而不是链接的答案中使用的追加。

root.insert(3, member2)

输出为:

<file>
   <page id="1">
      <text id="1"> sample text </text>
      <text id="2"> sample text II </text>
   </page>
   <page id="2">
      <text id="1"> sample text copy</text>
      <text id="2"> sample text me </text>
   </page>
   <page id="3">
      <text id="1"> sample text hello </text>
      <text id="2"> sample text world </text>
   </page>
   <page id="2.1">
      <text id="1"> sample text copy</text>
      <text id="2"> sample text me </text>
   </page>
   <page id="4">
      <text id="1"> sample text game </text>
      <text id="2"> sample text over </text>
   </page>
</file>