2011-10-26 28 views
18

我有一個xml文件,我使用lxml的etree來處理,但是當我添加標籤給它時,漂亮的打印似乎不起作用。lxml中的漂亮打印失敗當我添加標籤到解析的樹

>>> from lxml import etree 
>>> root = etree.parse('file.xml').getroot() 
>>> print etree.tostring(root, pretty_print = True) 

<root> 
    <x> 
    <y>test1</y> 
    </x> 
</root> 

到目前爲止這麼好。但現在

>>> x = root.find('x') 
>>> z = etree.SubElement(x, 'z') 
>>> etree.SubElement(z, 'z1').attrib['value'] = 'val1' 
>>> print etree.tostring(root, pretty_print = True) 

<root> 
    <x> 
    <y>test1</y> 
    <z><z1 value="val1"/></z></x> 
</root> 

它不再漂亮。我還試圖在「創建z1標籤」的地方「向後」做,然後創建z標籤並將z1附加到它,然後將z標籤附加到x標籤。但是我得到了同樣的結果。

如果我沒有解析文件,只是一次創建所有標籤,它會正確打印。所以我認爲它與解析文件有關。

如何讓漂亮的打印工作?

回答

30

它與lxml如何處理空格有關 - 請參閱lxml FAQ以瞭解詳細信息。

爲了解決這個問題,該文件的加載部分更改爲以下:

parser = etree.XMLParser(remove_blank_text=True) 
root = etree.parse('file.xml', parser).getroot() 

我沒有測試它,但它應該縮進您的文件只是這種變化的罰款。

+1

好啊,這似乎是工作。我曾經看過這個FAQ的問題,但我想我錯了。我認爲這是說它應該只是如果你有文本數據與空白在其中,而我沒有。但是,如果你有任何帶有文本數據的_any_元素,我想這很重要。感謝您的快速解決。 –