python: сохранение XML-форматирования с использованием etree - PullRequest
0 голосов
/ 20 сентября 2019

Я использую lxml etree для форматирования xml и изменения некоторых значений.Вот фрагмент входного XML

        <FIELD
            NAME="A"
            SHORT_DESCRIPTION="AAAAA"
            OFFSET="0"
            WIDTH="0"
        >       </FIELD>

        <FIELD
            NAME="B"
            SHORT_DESCRIPTION="BBBBBB"
            OFFSET="1"
            WIDTH="1"
        >       </FIELD>

code:

        from lxml import etree as ET
        tree = ET.parse(path)
        root = tree.getroot()
        #read and modify attributes
        tree.write('output.xml', pretty_print=True) 

Но вывод имеет вид:

 <FIELD NAME="A" SHORT_DESCRIPTION="AAAAA" OFFSET="100" WIDTH="0"> </FIELD>

Я попытался преобразовать его встрока, а затем с помощью etree, но я получаю те же результаты.

Я ожидаю, что он будет в том же формате, что и XML-файл, который изначально был с атрибутами в нескольких строках.

1 Ответ

0 голосов
/ 20 сентября 2019

Вот пример чтения, изменения и записи и XML-файла с использованием lxml:

PS: Ваш XML-ввод недействителен, вам нужно обернуть его в parendтег

input.xml

<items>
<FIELD NAME="A" SHORT_DESCRIPTION="AAAAA" OFFSET="0" WIDTH="0"></FIELD>
<FIELD NAME="B" SHORT_DESCRIPTION="BBBBBB" OFFSET="1" WIDTH="1"></FIELD>
</items>

modify_xml.py

from lxml import etree as ET


tree = ET.parse('input.xml')
root = tree.getroot()
# find all fields in the given root
fields = root.iterfind('.//FIELD')
# Example of modifying text and attributes of fields
for field in fields:
    if field.get('OFFSET') == '0':
        field.set('SHORT_DESCRIPTION', 'aaaa')
        field.text = 'TEST 0'
    else:
        field.set('SHORT_DESCRIPTION', 'bbbb')
        field.text = 'TEST 1'

tree.write('output.xml')

output.xml

<items>
<FIELD NAME="A" SHORT_DESCRIPTION="aaaa" OFFSET="0" WIDTH="0">TEST 0</FIELD>
<FIELD NAME="B" SHORT_DESCRIPTION="bbbb" OFFSET="1" WIDTH="1">TEST 1</FIELD>
</items>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...