Изменить все атрибуты XML, а затем объединить все результаты в один XML - PullRequest
0 голосов
/ 03 ноября 2018

Я пишу код Python ElementTree, который будет:

  1. Изменить itemID в xml и записать на диск.
  2. Перейти к следующему itemID в itemIDList, изменить itemID в xml и записать на диск

Проблема в том, что XML перезаписывается снова и снова, и я хочу добавить данные в конец нового XML-файла.

Пока это мой код.

base_path = os.path.dirname(os.path.realpath(__file__))
xml_file = os.path.join(base_path, 'data.xml')
tree = ET.parse(xml_file)
root = tree.getroot()

with open('a.txt', 'r') as f:

    d = f.readlines()
    itemIDlist = []
    for i in range(len(d)-1):
        hold = d[i].split('\n')
        itemIDlist.append(str(hold[0]))
        for e in root.iter():

            if 'itemID' in e.keys():
                e.set('itemID', itemIDlist[i])
                new_data = ET.tostringlist(root)
                new_xml = open('newXml.xml', 'w')
                new_xml.write(new_data)

В текстовом файле есть список чисел, подобных этим; мы называем это a.txt

19283
29354
34958
59854

Исходный файл XML выглядит следующим образом

    <requests>
    <inventory name="WaterMelon" itemID="6834833" action="inStock">
        <user username="Carlos">
            <role name="GeneralManager"/>
        </user>
    </inventory>
    <inventory name="StrawBerry" itemID="9283343" action="inStock">
        <user username="Carlos">
            <role name="GeneralManager"/>
        </user>
    </inventory>
    <inventory name="WaterMelon" itemID="" action="inStock">
        <user username="Carlos">
            <role name="GeneralManager"/>
        </user>
    </inventory>-->
</requests>

В настоящее время я получаю четыре разных файла, однако я просто хочу получить один XML-файл, содержащий все результаты. Это должно выглядеть так

<requests>
    <inventory action="inStock" itemID="19283" name="WaterMelon">
        <user username="Carlos">
            <role name="GeneralManager" />
        </user>
    </inventory>
    <inventory action="inStock" itemID="19283" name="StrawBerry">
        <user username="Carlos">
            <role name="GeneralManager" />
        </user>
    </inventory>
    <inventory action="inStock" itemID="19283" name="WaterMelon">
        <user username="Carlos">
            <role name="GeneralManager" />
        </user>
    </inventory>-->

    <inventory action="inStock" itemID="29354" name="WaterMelon">
        <user username="Carlos">
            <role name="GeneralManager" />
        </user>
    </inventory>
    <inventory action="inStock" itemID="29354" name="StrawBerry">
        <user username="Carlos">
            <role name="GeneralManager" />
        </user>
    </inventory>
    <inventory action="inStock" itemID="29354" name="WaterMelon">
        <user username="Carlos">
            <role name="GeneralManager" />
        </user>
    </inventory>-->

    <inventory action="inStock" itemID="34958" name="WaterMelon">
        <user username="Carlos">
            <role name="GeneralManager" />
        </user>
    </inventory>
    <inventory action="inStock" itemID="34958" name="StrawBerry">
        <user username="Carlos">
            <role name="GeneralManager" />
        </user>
    </inventory>
    <inventory action="inStock" itemID="34958" name="WaterMelon">
        <user username="Carlos">
            <role name="GeneralManager" />
        </user>
    </inventory>-->
</requests>

Пожалуйста, помогите

1 Ответ

0 голосов
/ 05 ноября 2018

У этой ссылки была та же проблема. Как написать XML-файл с несколькими корневыми элементами, используя ElementTree в python

Я связал строки.

with open('a.txt', 'r') as f:

d = f.readlines()
itemIDlist = []
new_data = ''
for i in range(len(d)-1):
    hold = d[i].split('\n')
    itemIDlist.append(str(hold[0]))
    for e in root.iter():

        if 'itemID' in e.keys():
            e.set('itemID', itemIDlist[i])

    new_data += ET.tostring(root)
new_xml = open('newXml.xml', 'w')
new_xml.write(new_data)

Это дает нам ожидаемый результат; один XML-файл.

    <requests>
    <inventory action="inStock" itemID="19283" name="WaterMelon">
        <user username="Carlos">
            <role name="GeneralManager" />
        </user>
    </inventory>
    <inventory action="inStock" itemID="19283" name="StrawBerry">
        <user username="Carlos">
            <role name="GeneralManager" />
        </user>
    </inventory>
    <inventory action="inStock" itemID="19283" name="WaterMelon">
        <user username="Carlos">
            <role name="GeneralManager" />
        </user>
    </inventory>--&gt;
</requests><requests>
    <inventory action="inStock" itemID="29354" name="WaterMelon">
        <user username="Carlos">
            <role name="GeneralManager" />
        </user>
    </inventory>
    <inventory action="inStock" itemID="29354" name="StrawBerry">
        <user username="Carlos">
            <role name="GeneralManager" />
        </user>
    </inventory>
    <inventory action="inStock" itemID="29354" name="WaterMelon">
        <user username="Carlos">
            <role name="GeneralManager" />
        </user>
    </inventory>--&gt;
</requests><requests>
    <inventory action="inStock" itemID="34958" name="WaterMelon">
        <user username="Carlos">
            <role name="GeneralManager" />
        </user>
    </inventory>
    <inventory action="inStock" itemID="34958" name="StrawBerry">
        <user username="Carlos">
            <role name="GeneralManager" />
        </user>
    </inventory>
    <inventory action="inStock" itemID="34958" name="WaterMelon">
        <user username="Carlos">
            <role name="GeneralManager" />
        </user>
    </inventory>--&gt;
</requests>

По-прежнему существует проблема, когда генерируется xml, существует>, который не интерпретируется должным образом и выдает
&gt; вместо >.

...