Обновление элементов XML и значений атрибутов с использованием Python etree - PullRequest
7 голосов
/ 07 февраля 2012

Я пытаюсь использовать библиотеку Python 2.7 ElementTree для анализа XML-файла, затем заменить определенные атрибуты элемента тестовыми данными, а затем сохранить его как уникальный XML-файл.

Моя идея длярешение заключалось в том, чтобы (1) получить новые данные из CSV-файла, прочитав файл в строку, (2) нарезать строку на определенные метки-разделители, (3) добавить в список, а затем (4) использовать ElementTreeобновить / удалить / заменить атрибут на определенное значение из списка.

Я просмотрел документацию ElementTree и увидел функции clear() и remove(), но понятия не имеюсинтаксис для их адекватного использования.

Ниже приведен пример XML-кода для изменения - атрибуты с XXXXX должны быть заменены / обновлены:

<TrdCaptRpt RptID="10000001" TransTyp="0">
    <RptSide Side="1" Txt1="XXXXX">
        <Pty ID="XXXXX" R="1"/>
    </RptSide>
</TrdCaptRpt>

Ожидаемый результат будет,например:

<TrdCaptRpt RptID="10000001" TransTyp="0">
    <RptSide Side="1" Txt1="12345">
        <Pty ID="ABCDE" R="1"/>
    </RptSide>
</TrdCaptRpt>

Как использовать команды etree, чтобы изменить базовый XML для обновления элемента из списка []?

1 Ответ

13 голосов
/ 08 февраля 2012

Для такого рода работ я всегда рекомендую BeautifulSoup, потому что у него действительно простой в освоении API:

from BeautifulSoup import BeautifulStoneSoup as Soup

xml = """
<TrdCaptRpt RptID="10000001" TransTyp="0">
    <RptSide Side="1" Txt1="XXXXX">
        <Pty ID="XXXXX" R="1"/>
    </RptSide>
</TrdCaptRpt>
"""

soup = Soup(xml)
rpt_side = soup.trdcaptrpt.rptside
rpt_side['txt1'] = 'Updated'
rpt_side.pty['id'] = 'Updated'

print soup

Пример вывода:

<trdcaptrpt rptid="10000001" transtyp="0">
<rptside side="1" txt1="Updated">
<pty id="Updated" r="1">
</pty></rptside>
</trdcaptrpt>

Редактировать: С xml.etree.ElementTree вы можете использовать следующий скрипт:

from xml.etree import ElementTree as etree

xml = """
<TrdCaptRpt RptID="10000001" TransTyp="0">
    <RptSide Side="1" Txt1="XXXXX">
        <Pty ID="XXXXX" R="1"/>
    </RptSide>
</TrdCaptRpt>
"""

root = etree.fromstring(xml)
rpt_side = root.find('RptSide')
rpt_side.set('Txt1', 'Updated')
pty = rpt_side.find('Pty')
pty.set('ID', 'Updated')
print etree.tostring(root)

Пример вывода:

<TrdCaptRpt RptID="10000001" TransTyp="0">
    <RptSide Side="1" Txt1="Updated">
        <Pty ID="Updated" R="1" />
    </RptSide>
</TrdCaptRpt>
...