python elementtree - как найти все элементы в xml с определенным атрибутом - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть xml в похожей структуре:

<terms>
    <entry ID="1">
        <language ID="1">en</language>
        <term>user</term>
        <state>text</state>
        <use>text</use>
        <definition ID="1">text</definition>
            <subdefinition ID="1">text</subdefinition>
        <definition-source>text</definition-source>
        <source ID="1">text</source>
        <circle>text</circle>
    </entry>

В этом случае родительский и дочерний элементы содержат атрибут ID. Есть ли способ, как найти все элементы из дерева, которое содержит идентификатор атрибута и изменить значение на 0 или удалить его?

Я пытался сделать это с XPath, но это сложно, когда существует глубокая иерархия, и любой из элементов может иметь этот атрибут. другой способ - обработать его как строку, но есть ли способ сделать это в ElementTree?

1 Ответ

1 голос
/ 29 апреля 2019

Использование XPath .//*[@ID] должно быть довольно простым для выбора элементов.

Вот пример изменения всех значений ID на 0 ...

Ввод XML (test.xml)

<terms>
    <entry ID="1">
        <language ID="1">en</language>
        <term>user</term>
        <state>text</state>
        <use>text</use>
        <definition ID="1">text</definition>
            <subdefinition ID="1">text</subdefinition>
        <definition-source>text</definition-source>
        <source ID="1">text</source>
        <circle>text</circle>
    </entry>
</terms>

Python

import xml.etree.ElementTree as ET

tree = ET.parse("test.xml")

for elem in tree.findall(".//*[@ID]"):
    elem.attrib["ID"] = "0"

ET.dump(tree.getroot())

Вывод (вывод на консоль)

<terms>
    <entry ID="0">
        <language ID="0">en</language>
        <term>user</term>
        <state>text</state>
        <use>text</use>
        <definition ID="0">text</definition>
            <subdefinition ID="0">text</subdefinition>
        <definition-source>text</definition-source>
        <source ID="0">text</source>
        <circle>text</circle>
    </entry>
</terms>
...