Добавьте полный XML как дочерний элемент узла XML в Python, используя XML - PullRequest
0 голосов
/ 31 января 2019

У меня есть следующие xmls (упрощенно):

База:

<root>
    <child1></child1>
    <child2></child2>
</root>

ChildInfo:

<ChildInfo>
    <Name>Something</Name>
    <School>ElementarySchool</School>
    <Age>7</Age>
</ChildInfo>

Ожидаемый выход:

<root>
    <child1></child1>
    <child2>
        <ChildInfo>
            <Name>Something</Name>
            <School>ElementarySchool</School>
            <Age>7</Age>
        </ChildInfo>
    </child2>
</root>

Этот случай упрощен только для обеспечения нужной мне функциональности.XMls в реальном сценарии действительно большие, поэтому построчное создание подэлемента не вариант, поэтому синтаксический анализ файла xml - единственный способ, которым я могу это сделать.

До сих пор у меня было следующее

pythonfile.py:

import xml.etree.ElementTree as ET

finalScript=ET.parse(r"resources/JmeterBase.xml")
samplerChild=ET.parse(r"resources/JmeterSampler.xml")
root=finalScript.getroot()
samplerChildRoot=ET.Element(samplerChild.getroot())
root.append(samplerChildRoot)

Но это не дает желаемой опции, и во всех руководствах по xml примеры очень просты и не справляются с этими случаями.

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

1 Ответ

0 голосов
/ 01 февраля 2019

Вы можете загрузить JmeterSampler.xml напрямую как элемент при использовании ET.fromstring(...), тогда вам просто нужно добавить элемент в нужное место:

import xml.etree.ElementTree as ET

finalScript = ET.parse(r"resources/JmeterBase.xml")
samplerChild = ET.fromstring(open(r"resources/JmeterSampler.xml").read())
root = finalScript.getroot()

child2 = root.find('child2')
child2.append(samplerChild)

print (ET.tostring(root, 'utf-8'))

Отпечатки:

<root>
    <child1 />
    <child2><ChildInfo>
    <Name>Something</Name>
    <School>ElementarySchool</School>
    <Age>7</Age>
    </ChildInfo>
    </child2>
</root>
...