Динамически добавлять значения в строку XML, используя python - PullRequest
0 голосов
/ 13 февраля 2020

Я новичок в XML и застрял на какой-то функции. Моя проблема в том, что у меня есть список и строка XML (структура XML не фиксирована). Я определил некоторый идентификатор в моей строке XML (здесь в моем случае это "{some_values}") с тем же именем, что и имя списка. Я хочу, чтобы при выполнении моего кода строка XML могла идентифицировать эту переменную списка, а значения, присутствующие в списке, будут динамически добавляться во время выполнения.

some_values=[1,2,3]

Ввод xml

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
    <Body>
        <Add xmlns="http://tempuri.org/">
            <intA>{some_values}</intA>
        </Add>
    </Body>
</Envelope>

OutPut Xml:

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
    <Body>
        <Add xmlns="http://tempuri.org/">
            <intA>1</intA>
            <intA>2</intA>
            <intA>3</intA>
        </Add>
    </Body>
</Envelope>

Мне нужен какой-то подход или решение, как решить эту проблему. Я прочитал некоторые библиотеки Python XML парсера и где-то прочитал, что мы можем обрабатывать строку XML, используя python шаблонизацию, но не можем найти решение, подходящее для этой конкретной проблемы.

1 Ответ

0 голосов
/ 14 февраля 2020

Попробуйте что-нибудь в этом духе:

import lxml.etree as ET

parser = ET.XMLParser()
some_values=[1,2,3]
content='''<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
    <Body>
        <Add xmlns="http://tempuri.org/">
            <intA>{some_values}</intA>
        </Add>
    </Body>
</Envelope>
'''
tree = ET.fromstring(content, parser)
item = tree.xpath('.//*[local-name()="intA"]')
par = item[0].getparent()

for val in reversed(some_values):
    new = ET.XML(f'<intA>{val}</intA>')
    par.insert(par.index(item[0])+1,new)
par.remove(item[0])

print(etree.tostring(tree).decode())

Вывод (вы можете исправить форматирование позже):

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
    <Body>
        <Add xmlns="http://tempuri.org/">
            <intA>1</intA><intA>2</intA><intA>3</intA></Add>
    </Body>
</Envelope>
...