2010-03-10 4 views
0

У меня есть XML (в виде дерева), мне нужно создать поддерево из него.Создание поддерева из дерева, которое представлено в xml - python

Для Ex:

<a> 
    <b> 
    <c>Hello</c> 
    <d> 
    <e>Hi</e> 
</a> 

Subtree будет

<root> 
<a> 
    <b> 
    <c>Hello</c> 
    </b> 
</a> 
<a> 
    <d> 
    <e>Hi</e> 
    </d> 
</a> 
</root> 

Что такое лучшая библиотека XML в Python, чтобы сделать это? Любой алгоритм, который уже делает это, также будет полезен. Примечание. XML-документ не будет таким большим, он будет легко вписываться в память.

ответ

3

ElementTree является хорошим и простым для «чтения» и «письма».

Ваш первый пример XML (я редактировал свой вопрос просто добавить форматирование, поэтому было бы читаемым!) Является недействительным, я предполагаю, что пропавшие близкие-теги для b и d, употребляемые в то, что вы называете «поддерево» (который выглядит ничего подобного поддерева для меня, но похоже, что он предназначен как переписывание вашей первой формы).

Net вопросы «prettyfication» (например, добавление новых строк и отступов, чтобы полученный XML выглядит довольно ;-), этот код должен делать то, что вы спрашиваете, если я вас правильно понимаю:

try: 
    import xml.etree.cElementTree as et 
    import cStringIO as sio 
except ImportError: 
    import xml.etree.ElementTree as et 
    import StringIO as sio 

xmlin = sio.StringIO('''<a> 
    <b> 
    <c>Hello</c> 
    </b> 
    <d> 
    <e>Hi</e> 
    </d> 
</a> 
''') 

tin = et.parse(xmlin) 
top = tin.getroot() 
tou = et.ElementTree(et.Element('root')) 
newtop = tou.getroot() 
for child in top.getchildren(): 
    subtree = et.Element(top.tag) 
    subtree.append(child) 
    newtop.append(subtree) 

import sys 
tou.write(sys.stdout) 

Try/except at the start пытается использовать версии C для модулей на «нормальных» платформах, где они доступны, в противном случае возвращаются к модулям pure-Python (для App Engine, Jython, IronPython, ...).

Затем я строю два дерева - tin, входной, из строки XML, которую вы даете; tou, выходный, изначально пустой, за исключением корневого элемента.

Всего остальное очень просто петля на все подэлементы из tin «корня s: для каждого из них подходит поддерево построено и добавляется к подэлементам tou» s корень - это все, что есть в ней.

Последние две строки показывают полученное дерево (не очень, из-за проблем с пробелами, но совершенно правильное с точки зрения структуры XML ;-).