используя значение элемента захвата lxml, затем удалите, чтобы создать шаблон XML - PullRequest
0 голосов
/ 09 ноября 2018

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

Вот пример различных файлов XML, которые я использую, в этих примерах я пытаюсь удалить значения:

spinach,cabbage and broccoli:

xml File1

<?xml version="1.0"?>
<rootelement>
    <Header>
        <Somebranch>
            <Somebranchitem1>HeaderValue1</Somebranchitem1>
            <Somebranchitem2>HeaderValue2</Somebranchitem2>
        </Somebranch>
        <anitem>1</anitem>
    </Header>
    <Body>
        <BodyItem>
            <subbodyitem>spinach</subbodyitem>
        </BodyItem>
    </Body>
</rootelement>

xml File2

<?xml version="1.0"?>
<rootelement>
    <Header>
        <Somebranch>
            <Somebranchitem1>HeaderValue1</Somebranchitem1>
            <Somebranchitem2>HeaderValue2</Somebranchitem2>
        </Somebranch>
        <anitem>123e</anitem>
    </Header>
    <Body>
        <AnItem>
            <Adifferentnameditem>cabbage</Adifferentnameditem>
            <Adifferentnameditem2>broccoli</Adifferentnameditem2>
        </AnItem>
    </Body>
</rootelement>

После извлечения я хочу создать новый файл в виде шаблона, похожего на этот:

<?xml version="1.0"?>
<rootelement>
    <Header>
        <Somebranch>
            <Somebranchitem1>HeaderValue1</Somebranchitem1>
            <Somebranchitem2>HeaderValue2</Somebranchitem2>
        </Somebranch>
        <anitem>123e</anitem>
    </Header>
    <Body>
        <AnItem>
            <Adifferentnameditem></Adifferentnameditem>
            <Adifferentnameditem2></Adifferentnameditem2>
        </AnItem>
    </Body>
</rootelement>

Я могу извлечь значения в словарь, но поскольку подэлементы 'Body' имеют разные имена в зависимости от файла XML, у меня возникают проблемы при создании универсального цикла.

Вот мой код функции:

import lxml.etree as et

def process_xml(xmlfilename):
    doc = et.parse(xmlfilename)

    params_dict = {}
    for tag in doc.iter():
        if not len(tag):
            element_name = tag.tag
            element_value = tag.text
            #print(tag.tag, ' >>>>>> ', tag.text)
            params_dict[element_name] = [element_value,]

        try:
            if tag in doc.xpath('//Body')
                # Do stuff
                # Remove sub-elements value
                # Then save as a new file
        except:
            print('It did not work')
...