2012-08-01 58 views
2

所以我必須在我看來這樣的功能:如何使用xml標籤將元素打印爲正確的xml?

from django.http import HttpResponse 
from xml.etree.ElementTree import Element, SubElement, Comment, tostring 

def helloworld(request): 
    root_element = Element("root_element") 
    comment = Comment("Hello World!!!") 
    root_element.append(comment) 
    foo_element = Element("foo") 
    foo_element.text = "bar" 
    bar_element = Element("bar") 
    bar_element.text = "foo" 
    root_element.append(foo_element) 
    root_element.append(bar_element) 
    return HttpResponse(tostring(root_element), "application/xml") 

它做什麼它打印是這樣的:

<root_element><!--Hello World!!!--><foo>bar</foo><bar>foo</bar></root_element> 

正如你所看到的,它缺少在開始的XML標籤。如何從XML聲明開始輸出正確的XML?

回答

4

如果您可以在您的項目中添加依賴項,我建議您使用lxml,它比Python附帶的基本xml模塊更完整和優化。

這樣做,你只需要你的import語句更改爲:

from lxml.etree import Element, SubElement, Comment, tostring 

然後,你就會有一個toString()以 'xml_declaration' 選項:

>>> tostring(root, xml_declaration=False) 
'<root_element><!--Hello World!!!--><foo>bar</foo><bar>foo</bar></root_element>' 
>>> tostring(root, xml_declaration=True) 
"<?xml version='1.0' encoding='ASCII'?>\n<root_element><!--Hello World!!!--><foo>bar</foo><bar>foo</bar></root_element>" 

在標準庫中,只有ElementTree的write()方法有一個xml_declaration選項。另一種解決方案是創建一個包裝器,它使用ElementTree.write()寫入StringIO,然後返回StringIO的內容。