Python: как скопировать и вставить элемент XML в определенном месте - PullRequest
0 голосов
/ 28 мая 2019

Я использую 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". Кроме того, я хочу изменить идентификатор нового элемента.

Как должен выглядеть результат:

<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>

* вставленный элемент

Я уже пробовал некоторые варианты этого , но у меня всегда были проблемы с атрибутами (в данном случае с id). В настоящее время я использую xml.etree.ElementTree, и было бы замечательно, если бы кто-нибудь помог мне решить мою проблему с этим пакетом, но я беру каждый пакет, который решает проблему.

1 Ответ

0 голосов
/ 28 мая 2019

Чтобы найти конкретный узел, используйте find () с некоторым XPath, чтобы получить узел страницы с 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>
...