質問
XML ドキュメントを構築して Web サービスに投稿する必要があるプロジェクトの一部を構築しようとしています。Python のスキルを拡張する手段として、それを Python で実行したいと考えています。
残念ながら、私は .NET の XML モデルについてはよく知っていますが、Python の XML モデルの長所と短所はわかりません。
Python で XML 処理を行った経験のある人はいますか?どこから始めたらよいでしょうか?これから構築する XML ファイルは非常に単純なものになります。
解決
個人的に、私は XML を多用するプロジェクトでいくつかの組み込みオプションを試してきましたが、次のような方法に落ち着きました。 プルダム それほど複雑ではないドキュメントに最適な選択肢です。
特に小規模で単純なものの場合、比較的単純な構造に大量のコールバックを設定するよりも、イベント駆動型の解析理論が好きです。 API の使用方法について簡単に説明します。.
私の好きな事:で解析を処理できます for
コールバックを使用するのではなくループします。また、完全な解析 (「プル」部分) を遅らせ、呼び出したときにのみ追加の詳細を取得します。 expandNode()
. 。これは、使いやすさとシンプルさを犠牲にすることなく、「責任ある」効率性に対する私の一般的な要件を満たします。
他のヒント
XML を扱うには、一般に 3 つの主な方法があります。ドム、サックス、およびエクスパス。xml ファイル全体を一度にメモリにロードする余裕があり、データ構造の処理を気にせず、モデルの大部分/ほとんどを確認できる場合は、dom モデルが適しています。サックス モデルは、少数のタグだけを気にする場合、または大きなファイルを扱っていてそれらを順次処理できる場合に最適です。xpath モデルは、それぞれを少しずつ組み合わせたものです。必要なデータ要素へのパスを選択できますが、使用するライブラリがさらに必要になります。
単純で Python でパッケージ化したい場合は、minidom が答えになりますが、これは非常に不十分で、ドキュメントは「ここに dom のドキュメントがあります。調べてください」というものです。本当に迷惑です。
個人的には、DOM のようなモデルである ElementTree のより高速な (C ベースの) 実装である cElementTree が好きです。
私はサックス システムを使用したことがありますが、多くの点でその感触はより「Python的」ですが、通常はそれらを処理するために状態ベースのシステムを作成することになり、そこには狂気 (およびバグ) が存在します。
研究が好きなら minidom を、うまく機能する優れたコードが必要なら ElementTree を使うといいと思います。
私はいくつかのプロジェクトで ElementTree を使用しましたが、それをお勧めします。
これは Python であり、純粋な Python バージョンより 20 倍高速で、非常に使いやすい C バージョン cElementTree (xml.etree.cElementTree) を含む Python 2.5 に「同梱」されています。
lxml にはパフォーマンス上の利点がいくつかありますが、ばらつきがあるため、最初に使用例に応じてベンチマークを確認する必要があります。
私の理解では、ElementTree コードは簡単に lxml に移植できます。
それは、文書がどの程度複雑である必要があるかによって少し異なります。
XML を記述するために minidom をよく使用しましたが、通常はドキュメントを読み取って、いくつかの簡単な変換を行って、それらを書き戻すだけでした。(XML を適切に解析しない古いアプリケーションを満たすために) 要素の属性を順序付ける機能が必要になるまでは、これで十分に機能しました。その時点で私は諦めて自分で XML を書きました。
単純なドキュメントのみを扱う場合は、フレームワークを学ぶよりも自分で行う方が早くて簡単です。XML を手動で記述できる可能性がある場合は、おそらく手動でコーディングすることもできます (特殊文字を適切にエスケープし、次を使用することを忘れないでください) str.encode(codec, errors="xmlcharrefreplace")
)。これらの厄介な問題を除けば、XML は十分に規則的であるため、 必要 それを書くための特別なライブラリ。ドキュメントが複雑すぎて手書きできない場合は、おそらく、すでに述べたフレームワークのいずれかを検討する必要があります。どの時点でも、一般的な XML ライターを作成する必要はありません。
試してみることもできます もつれを解く 単純な XML ドキュメントを解析します。
「かなり単純な」XML を構築すると述べたので、 ミニダムモジュール (Python 標準ライブラリの一部) はおそらくニーズに合うでしょう。XML の DOM 表現に関する経験がある場合は、API が非常に簡単であることがわかるはずです。
XML リクエストを受信し、XML レスポンスを作成する SOAP サーバーを作成します。(残念ながら、これは私のプロジェクトではないため、クローズドソースですが、それは別の問題です)。
スキーマに「適合する」データ構造があれば、(SOAP) XML ドキュメントの作成は非常に簡単であることがわかりました。
応答エンベロープは要求エンベロープと(ほぼ)同じであるため、エンベロープを保持します。次に、私のデータ構造は (おそらくネストされた) 辞書であるため、この辞書を <key>value</key> 項目に変換する文字列を作成します。
これは再帰によって簡単になるタスクであり、最終的には正しい構造が得られます。これはすべて Python コードで実行され、現時点では運用環境で使用するのに十分な速度です。
リストも(比較的)簡単に作成できますが、クライアントによっては長さのヒントを与えないと問題が発生する可能性があります。
私にとって、辞書はカスタム クラスよりもはるかに簡単な作業方法であるため、これははるかに簡単でした。本の場合、XML の生成は解析よりもはるかに簡単です。
Python で XML を本格的に扱う場合は、lxml を使用してください。
Python には ElementTree 組み込みライブラリが付属していますが、lxml は速度と機能 (スキーマ検証、Sax 解析、XPath、さまざまな種類のイテレータ、およびその他の多くの機能) の点でそれを拡張します。
これはインストールする必要がありますが、多くの場所ではすでに標準装備の一部であると想定されています (例:Google AppEngine では C ベースの Python パッケージは許可されませんが、lxml、pyyaml、およびその他のいくつかについては例外となります)。
E-factory を使用した XML ドキュメントの構築 (lxml から)
あなたの質問は、XML ドキュメントの構築に関するものです。
lxml には多くのメソッドがあり、使いやすく、読みやすいと思われるメソッドを見つけるのに時間がかかりました。
サンプルコードから E-factory の使用に関する lxml ドキュメント (少し簡略化しました):
E-factory は、XML と HTML を生成するためのシンプルでコンパクトな構文を提供します。
>>> from lxml.builder import E
>>> html = page = (
... E.html( # create an Element called "html"
... E.head(
... E.title("This is a sample document")
... ),
... E.body(
... E.h1("Hello!"),
... E.p("This is a paragraph with ", E.b("bold"), " text in it!"),
... E.p("This is another paragraph, with a", "\n ",
... E.a("link", href="http://www.python.org"), "."),
... E.p("Here are some reserved characters: <spam&egg>."),
... )
... )
... )
>>> print(etree.tostring(page, pretty_print=True))
<html>
<head>
<title>This is a sample document</title>
</head>
<body>
<h1>Hello!</h1>
<p>This is a paragraph with <b>bold</b> text in it!</p>
<p>This is another paragraph, with a
<a href="http://www.python.org">link</a>.</p>
<p>Here are some reserved characters: <spam&egg>.</p>
</body>
</html>
E-factoryでは以下のことに感謝しています
コードは結果として得られる XML ドキュメントとほぼ同じように読み取られます。
読みやすさが重要です。
任意の XML コンテンツの作成を許可します
次のようなものをサポートします。
- 名前空間の使用
- 1 つの要素内のテキスト ノードの開始と終了
- 属性の内容をフォーマットする関数 (「関数 CLASS」を参照) 完全な lxml サンプル)
リストを含む非常に読みやすい構造を可能にします
例えば。:
from lxml import etree
from lxml.builder import E
lst = ["alfa", "beta", "gama"]
xml = E.root(*[E.record(itm) for itm in lst])
etree.tostring(xml, pretty_print=True)
その結果:
<root>
<record>alfa</record>
<record>beta</record>
<record>gama</record>
</root>
結論
lxml チュートリアルを読むことを強くお勧めします。非常によく書かれており、この強力なライブラリを使用する理由がさらにたくさんあります。
lxml の唯一の欠点は、コンパイルする必要があることです。見る さらなるヒントについてはSO回答 ホイール形式パッケージから lxml を数秒以内にインストールする方法。
SOAP メッセージを作成する場合は、こちらを確認してください。 ソープリブ. 。内部では ElementTree を使用しますが、メッセージをシリアル化および逆シリアル化するためのよりクリーンなインターフェイスを提供します。
強くお勧めします SAX - Simple API for XML
- Python ライブラリでの実装。セットアップと大規模な処理が非常に簡単です XML
たとえ運転されても API
, 、以前の投稿者で説明したように、検証とは異なりメモリ フットプリントが低くなります。 DOM
スタイル XML
パーサー。
XML を処理する .Net 方式は、MSXML の一部のバージョンに基づいて構築されていると思います。その場合、たとえば minidom を使用すると、多少は安心できると思います。ただし、単純な処理であれば、どのライブラリでも実行できるでしょう。
また、Python で XML を扱うときは、ElementTree を使用することを好みます。これは非常に優れたライブラリです。