基本的に、System.Xml.XmlWriter - メモリ オーバーヘッドがあまり発生しないストリーミング XML ライターに似たものです。したがって、xml.dom と xml.dom.minidom は除外されます。提案?
6 に答える
xml.sax.saxutils の XMLGenerator が、必要なものに最も近いことがわかると思います。
輸入時間
xml.sax.saxutils からインポート XMLGenerator
from xml.sax.xmlreader import AttributesNSImpl
LOG_LEVELS = [「デバッグ」、「警告」、「エラー」]
クラス xml_logger:
def __init__(自己、出力、エンコーディング):
"""
SAX イベントと出力を取得するロガー オブジェクトを設定します。
XML ログ ファイル
"""
logger = XMLGenerator(出力、エンコード)
logger.startDocument()
attrs = AttributesNSImpl({}, {})
logger.startElementNS((None, u'log'), u'log', attrs)
self._logger = ロガー
self._output = 出力
self._encoding = エンコーディング
戻る
def write_entry (自己、レベル、msg):
"""
ロガーにログ エントリを書き込む
level - エントリのレベル
msg - エントリのテキスト。Unicode オブジェクトでなければなりません
"""
#注: 実際のアプリケーションでは、日付に ISO 8601 を使用します
ここでは単純化のために #asctime を使用
今 = time.asctime(time.localtime())
attr_vals = {
(なし、u'date'): 今、
(なし、u'レベル'): LOG_LEVELS[レベル]、
}
attr_qnames = {
(なし、u'date'): u'date',
(なし、u'level'): u'level',
}
attrs = AttributesNSImpl(attr_vals, attr_qnames)
self._logger.startElementNS((None, u'entry'), u'entry', attrs)
self._logger.characters(msg)
self._logger.endElementNS((None, u'entry'), u'entry')
戻る
デフクローズ(自己):
"""
ロガー オブジェクトをクリーンアップする
"""
self._logger.endElementNS((None, u'log'), u'log')
self._logger.endDocument()
戻る
if __name__ == "__main__":
#試してみる
システムをインポート
xl = xml_logger(sys.stdout, 'utf-8')
xl.write_entry(2, u"バニラ ログ エントリ")
xl.close()
おそらく、私がhttp://www.xml.com/pub/a/2003/03/12/py-xml.htmlから入手した記事の残りの部分を見たいと思うでしょう。
数年前、私は4suiteMarkupWriterから使用しました
General-purpose utility class for generating XML (may eventually be expanded to produce more output types) Sample usage: from Ft.Xml import MarkupWriter writer = MarkupWriter(indent=u"yes") writer.startDocument() writer.startElement(u'xsa') writer.startElement(u'vendor') #Element with simple text (#PCDATA) content writer.simpleElement(u'name', content=u'Centigrade systems') #Note writer.text(content) still works writer.simpleElement(u'email', content=u"info@centigrade.bogus") writer.endElement(u'vendor') #Element with an attribute writer.startElement(u'product', attributes={u'id': u"100\u00B0"}) #Note writer.attribute(name, value, namespace=None) still works writer.simpleElement(u'name', content=u"100\u00B0 Server") #XML fragment writer.xmlFragment('<version>1.0</version><last-release>20030401</last-release>') #Empty element writer.simpleElement(u'changes') writer.endElement(u'product') writer.endElement(u'xsa') writer.endDocument() Note on the difference between 4Suite writers and printers Writer - module that exposes a broad public API for building output bit by bit Printer - module that simply takes a DOM and creates output from it as a whole, within one API invokation
最近、lxmlがいかに優れているかについてよく耳にしますが、私は直接の経験がなく、gnosisでの作業を楽しんでいました。
lxmlで常に良い結果が得られました。ほとんどがlibxml2のラッパーであるため、インストールするのは面倒ですが、lxml.etree ツリー オブジェクトには、.write()ストリーミング先のファイルのようなオブジェクトを受け取るメソッドがあります。
from lxml.etree import XML
tree = XML('<root><a><b/></a></root>')
tree.write(your_file_object)
ElementTree の 2 番目の投票 (cElementTree は、cPickle と pickle のように、少し高速な C 実装です)。ここにいくつかの短いサンプル コードがあります。これを参照して、どのように機能するかを理解してください: http://effbot.org/zone/element-index.htm (これは、最初にモジュールを作成した Fredrik Lundh です) . 2.5 で標準ライブラリにドラフトされたのはとても良いことです :-) )
xml.etree.cElementTree、2.5 以降の CPython のデフォルト ディストリビューションに含まれています。XML の読み取りと書き込みの両方が非常に高速です。