Извлечение необработанного XML с помощью lxml etree - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь извлечь необработанный XML из файла XML.

Так что, если мои данные:

        <xml>
            ... Lots of XML ...

            <getThese>
                <clonedKey>1</clonedKey>
                <clonedKey>2</clonedKey>
                <clonedKey>3</clonedKey>
                <randomStuff>this is a sentence</randomStuff>
            </getThese>         
            <getThese>
                <clonedKey>6</clonedKey>
                <clonedKey>8</clonedKey>
                <clonedKey>3</clonedKey>
                <randomStuff>more words</randomStuff>
            </getThese>

            ... Lots of XML ...

        </xml>

Я могу легко получить нужные мне ключи, используя etree:

from lxml import etree
search_me = etree.fromstring(xml_str)
search_me.findall('./xml/getThis')

Но как мне получить фактический контент в виде необработанного XML? Все, что я вижу в документах, это для получения элементов / текста / атрибутов, а не сырого XML.

Мой желаемый вывод - список с двумя элементами:

["<getThese>
                <clonedKey>1</clonedKey>
                <clonedKey>2</clonedKey>
                <clonedKey>3</clonedKey>
                <randomStuff>this is a sentence</randomStuff>
            </getThese>",
"<getThese>
                <clonedKey>6</clonedKey>
                <clonedKey>8</clonedKey>
                <clonedKey>3</clonedKey>
                <randomStuff>more words</randomStuff>
            </getThese>"]

1 Ответ

1 голос
/ 29 мая 2019

Вы должны иметь возможность использовать tostring () для сериализации XML.

Пример ...

from lxml import etree

xml = """
<xml>
    <getThese>
        <clonedKey>1</clonedKey>
        <clonedKey>2</clonedKey>
        <clonedKey>3</clonedKey>
        <randomStuff>this is a sentence</randomStuff>
    </getThese>         
    <getThese>
        <clonedKey>6</clonedKey>
        <clonedKey>8</clonedKey>
        <clonedKey>3</clonedKey>
        <randomStuff>more words</randomStuff>
    </getThese>
</xml>
"""

parser = etree.XMLParser(remove_blank_text=True)

tree = etree.fromstring(xml, parser=parser)

elems = []

for elem in tree.xpath("getThese"):
    elems.append(etree.tostring(elem).decode())

print(elems)

Печатная продукция ...

['<getThese><clonedKey>1</clonedKey><clonedKey>2</clonedKey><clonedKey>3</clonedKey><randomStuff>this is a sentence</randomStuff></getThese>', '<getThese><clonedKey>6</clonedKey><clonedKey>8</clonedKey><clonedKey>3</clonedKey><randomStuff>more words</randomStuff></getThese>']
...