2

だから私は私の見解でこの関数を持っています:

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

1 に答える 1

4

プロジェクトに依存関係を追加できる場合は、Python に付属の基本的な xml モジュールよりも完全で最適化されたlxmlを使用することをお勧めします。

これを行うには、インポートステートメントを次のように変更するだけです:

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

そして、「xml_declaration」オプションを指定した tostring() が作成されます。

>>> 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 のコンテンツを返すラッパーを作成することです。

于 2012-08-01T15:26:13.510 に答える