2012-05-12 3 views
5

Возможно ли использовать lxml (или встроенную электронную библиотеку) для создания объекта, который представляет фрагмент xml, но содержит два (или более) непересекающихся дерева (т.е. каждое дерево имеет свой собственный отдельный корень, но у них нет общего предка)?lxml Создать XML-фрагмент без элемента root?

То есть, есть все, что может представлять следующее без создания другого элемента, чтобы держать их обоих:

<tree id="A"><anotherelement/></tree> 
<tree id="B"><yetanotherelement/></tree> 

Я не вижу ничего в документации LXML, которая позволила бы, что и StackOverflow кажется не иметь ничего прямо на месте.

В данном случае я создаю xml программно, и фрагменты будут собраны в один документ для вывода. Мне нужен объект, который мне не нужен, чтобы перебрать/специальный случай, просто перейдите к методам lxml, как если бы это было надлежащее дерево.

(Я знаю, что такие фрагменты сами по себе не были бы полным и правильным документом xml, я хочу хранить промежуточные продукты перед сборкой в ​​такой документ).

+0

Как насчет того, чтобы просто составить список объектов lxml? Это в значительной степени то, что у вас есть ... – larsks

+0

@larsks Правильно, но тогда мне нужно написать код, который обрабатывает наличие списка, а не передавать объект типа, который ожидает XML-API. Это также влечет за собой либо специальный код в моем коде, либо всегда держит список. Поэтому было бы предпочтительнее. – Marcin

ответ

4

да, есть такая функциональность в lxml.html пакете, это называется fragment_fromstring или fragments_fromstring, но в большинстве случаев HTML Parser также обрабатывает XML достаточно хорошо:

from lxml import etree, html 

xml = """ 
    <tree id="A"><anotherelement/></tree> 
    <tree id="B"><yetanotherelement/></tree> 
""" 

fragments = html.fragments_fromstring(xml) 

root = etree.Element("root") 
for f in fragments: 
    root.append(f) 

print etree.tostring(root, pretty_print=True) 

выход:

<root> 
    <tree id="A"> 
    <anotherelement/> 
    </tree> 
    <tree id="B"> 
    <yetanotherelement/> 
    </tree> 
</root> 

, если вы посмотрите на what's going on under the hood, вероятно, было бы не слишком сложно сделать то же самое с помощью анализатора xml, если вы не удовлетворены другим результатом.

+0

Спасибо за это. Я действительно хочу создать фрагмент программно, поэтому я загляну в капот. – Marcin

+0

Ах, он по-прежнему возвращает список - я надеялся, что будет способ создать объект, который мне не нужен для итерации над/специальным случаем, просто перейдите к методам lxml, как если бы это было надлежащее дерево. Я приму этот ответ в ближайшие пару дней, полагая, что никто не знает о каком-то волшебном методе. – Marcin

+0

+1, но определенно важно знать, что 'fragments_fromstring()' возвращает список, а 'fragment_fromstring()' будет только за исключением одного элемента – JCotton

Смежные вопросы