2014-10-06 3 views
0

У меня есть входной файл вида:LXML: скопировать и переименовать кучу элементов

<article> 
<pages> 
    <list-item>content of page 1</list-item> 
    <list-item>content of page 2</list-item> 
    <list-item>content of page 3</list-item> 
</pages> 
</article> 

Я хочу, чтобы преобразовать его в другой файл XML выглядит как

<text> 
    <page>content of page 1</page> 
    <page>content of page 2</page> 
    <page>content of page 3</page> 
</text> 

Следующая уродливый кусок кода делает то, что я хочу добиться:

oldtree = etree.parse(infile) 
newtree = etree.Element("text") 
newtree.append(oldtree.find("pages")) 
outfile.write(etree.tostring(newtree).replace(u"<pages>", u"").replace(u"</pages>",u"").replace(u"<list-item>", u"<page>").replace("</list-item>", u"</page>")) 

уродливый часть является путаница преобразований XML с грубой Forc e замены. Есть ли более чистый и прекрасный способ достичь моей цели?

+0

Вы отметили этот XSLT, но вы не используете его по какой-то причине. –

ответ

4

Что-то вроде:

from lxml.etree import fromstring, tostring 

text_tree = """ 
<article> 
<pages> 
    <list-item>content of page 1</list-item> 
    <list-item>content of page 2</list-item> 
    <list-item>content of page 3</list-item> 
</pages> 
</article> 
""" 

pages = fromstring(text_tree).find('pages') 
pages.tag = 'text' 
for list_item in pages.findall('list-item'): 
    list_item.tag = 'page' 

print tostring(pages) 

Даст:

<text> 
    <page>content of page 1</page> 
    <page>content of page 2</page> 
    <page>content of page 3</page> 
</text> 
Смежные вопросы