16

基本的に、System.Xml.XmlWriter - メモリ オーバーヘッドがあまり発生しないストリーミング XML ライターに似たものです。したがって、xml.dom と xml.dom.minidom は除外されます。提案?

4

6 に答える 6

15

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から入手した記事の残りの部分を見たいと思うでしょう。

于 2008-09-18T16:22:28.067 に答える
2

私はあなたの毒を持っていると思います:

http://sourceforge.net/projects/xmlite

乾杯

于 2008-09-18T15:54:07.933 に答える
0

数年前、私は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での作業を楽しんでいました。

于 2008-09-18T16:08:21.720 に答える
-1

lxmlで常に良い結果が得られました。ほとんどがlibxml2のラッパーであるため、インストールするのは面倒ですが、lxml.etree ツリー オブジェクトには、.write()ストリーミング先のファイルのようなオブジェクトを受け取るメソッドがあります。

from lxml.etree import XML

tree = XML('<root><a><b/></a></root>')
tree.write(your_file_object)
于 2008-09-18T15:57:23.837 に答える
-2

ElementTree の 2 番目の投票 (cElementTree は、cPickle と pickle のように、少し高速な C 実装です)。ここにいくつかの短いサンプル コードがあります。これを参照して、どのように機能するかを理解してください: http://effbot.org/zone/element-index.htm (これは、最初にモジュールを作成した Fredrik Lundh です) . 2.5 で標準ライブラリにドラフトされたのはとても良いことです :-) )

于 2008-09-18T22:17:07.310 に答える
-4

xml.etree.cElementTree、2.5 以降の CPython のデフォルト ディストリビューションに含まれています。XML の読み取りと書き込みの両方が非常に高速です。

于 2008-09-18T15:55:24.780 に答える