82

XML ドキュメントを構築して Web サービスに投稿する必要があるプロジェクトの一部を構築しようとしています。スキルを拡張する手段として、Python でそれを行いたいと考えています。

残念ながら、私は .NET での XML モデルについてはかなりよく知っていますが、Python での XML モデルの長所と短所はよくわかりません。

Python で XML 処理を行った経験のある人はいますか? どこから始めることをお勧めしますか? これから作成する XML ファイルはかなり単純なものになります。

4

12 に答える 12

35

個人的には、XML を多用するプロジェクトでいくつかの組み込みオプションを試してみた結果、あまり複雑でないドキュメントに最適な選択肢としてpulldomに落ち着きました。

特に小さな単純なものについては、比較的単純な構造に対して多数のコールバックを設定するよりも、解析のイベント駆動型理論が好きです。 ここでは、API の使用方法について簡単に説明します

私が気に入っているのは、forコールバックを使用するのではなく、ループで解析を処理できることです。また、完全な解析 (「プル」部分) を遅らせ、 を呼び出したときに追加の詳細のみを取得しますexpandNode()。これは、使いやすさとシンプルさを犠牲にすることなく、「責任ある」効率性に対する私の一般的な要件を満たしています。

于 2008-08-02T04:01:34.600 に答える
33

ElementTreeには素晴らしい pythony API があります。Python 2.5の一部として出荷されていると思います

それは純粋な python であり、私が言うようにかなり素晴らしいですが、より多くのパフォーマンスが必要になった場合、lxmlは同じ API を公開し、フードの下で libxml2 を使用します。理論的には、必要になったときに交換するだけです。

于 2008-08-02T15:21:03.587 に答える
8

それは、ドキュメントがどれほど複雑である必要があるかに少し依存します。

私はXMLの記述にミニダムを頻繁に使用しましたが、それは通常、ドキュメントを読み取り、いくつかの単純な変換を行い、それらを書き戻すことです。これは、要素属性を順序付ける機能が必要になるまで(XMLを適切に解析しない古いアプリケーションを満たすために)十分に機能しました。その時点で私はあきらめてXMLを自分で書きました。

単純なドキュメントのみを処理している場合は、フレームワークを学習するよりも、自分で実行する方が迅速かつ簡単です。XMLを手動で記述できる場合は、おそらく手動でコーディングすることもできます(特殊文字を適切にエスケープし、を使用することを忘れないでstr.encode(codec, errors="xmlcharrefreplace")ください)。これらのスナフスを除けば、XMLは十分に規則的であるため、それを作成するために特別なライブラリは必要ありません。ドキュメントが複雑すぎて手で書くことができない場合は、おそらくすでに述べたフレームワークの1つを調べる必要があります。一般的なXMLライターを作成する必要はありません。

于 2008-10-14T18:26:04.833 に答える
8

XMLを処理するには、一般に、dom、sax、xpathの3つの主要な方法があります。domモデルは、xmlファイル全体を一度にメモリにロードする余裕があり、データ構造を処理することを気にせず、モデルの大部分/大部分を調べている場合に適しています。saxモデルは、少数のタグのみを気にする場合、および/または大きなファイルを処理してそれらを順番に処理できる場合に最適です。xpathモ​​デルはそれぞれ少しずつです。必要なデータ要素へのパスを選択できますが、使用するにはより多くのライブラリが必要です。

簡単でPythonにパッケージ化したい場合は、minidomが答えですが、それはかなり不十分であり、ドキュメントは「domに関するドキュメントです。理解してください」です。本当に迷惑です。

個人的には、domのようなモデルであるElementTreeのより高速な(cベースの)実装であるcElementTreeが好きです。

私はサックスシステムを使用してきましたが、多くの点でそれらはより「パイソン的」な感じですが、通常はそれらを処理するために状態ベースのシステムを作成することになり、そのように狂気(およびバグ)があります。

研究が好きならミニダムで、うまくいく良いコードが欲しいならElementTreeで行くと言います。

于 2008-09-16T04:35:28.113 に答える
8

私はいくつかのプロジェクトで ElementTree を使用してきましたが、これをお勧めします。

Pythonic で、Python 2.5 に同梱されています。これには、純粋な Python バージョンよりも 20 倍高速で、非常に使いやすい c バージョンの cElementTree (xml.etree.cElementTree) が含まれています。

lxml にはいくつかのパフォーマンス上の利点がありますが、それらは一様ではなく、ユース ケースのベンチマークを最初に確認する必要があります。

私が理解しているように、ElementTree コードは簡単に lxml に移植できます。

于 2008-09-23T19:42:58.003 に答える
7

untangleを試して単純な XML ドキュメントを解析することもできます。

于 2011-10-31T14:05:09.450 に答える
6

「かなり単純な」XML を構築すると述べたので、minidom モジュール(Python 標準ライブラリの一部) がニーズに合っている可能性があります。XML の DOM 表現の経験があれば、API は非常に簡単に理解できるはずです。

于 2008-08-02T18:04:10.543 に答える
6

XML 要求を受信して​​ XML 応答を作成する SOAP サーバーを作成します。(残念ながら、これは私のプロジェクトではないため、クローズド ソースですが、それは別の問題です)。

スキーマに「適合する」データ構造があれば、(SOAP) XML 文書の作成は非常に簡単であることがわかりました。

応答エンベロープは要求エンベロープと (ほぼ) 同じであるため、エンベロープを保持します。次に、私のデータ構造は (ネストされている可能性がある) 辞書であるため、この辞書を <key>value</key> 項目に変換する文字列を作成します。

これは再帰によって単純化されるタスクであり、最終的に正しい構造が得られます。これはすべて python コードで行われ、現在は本番環境で使用するのに十分な速さです。

また、(比較的) 簡単にリストを作成することもできますが、クライアントによっては、長さのヒントを提供しないと問題が発生する可能性があります。

私にとっては、辞書はカスタム クラスよりもはるかに簡単な作業方法であるため、これははるかに簡単でした。書籍の場合、XML の生成は解析よりもはるかに簡単です。

于 2008-08-03T08:34:57.103 に答える
5

Python で XML を本格的に扱うには、lxml を使用します

Python には ElementTree 組み込みライブラリが付属していますが、lxml は速度と機能 (スキーマ検証、sax 解析、XPath、さまざまな種類の反復子、およびその他の多くの機能) の点でそれを拡張します。

インストールする必要がありますが、多くの場所では、すでに標準装備の一部であると想定されています (たとえば、Google AppEngine は C ベースの Python パッケージを許可していませんが、lxml、pyyaml、およびその他のいくつかについては例外を設けています)。

E-factory を使用した XML ドキュメントの構築 (lxml から)

あなたの質問は、XML 文書の作成に関するものです。

lxmlには多くのメソッドがあり、使いやすく読みやすいと思われるメソッドを見つけるのに時間がかかりました。

E-factory の使用に関する lxml doc のサンプル コード(少し簡略化):


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: &lt;spam&amp;egg&gt;.</p>
  </body>
</html>

私はE-factoryに次のことを感謝します

コードは結果の XML ドキュメントとほぼ同じように読み取れます

読みやすさが重要です。

任意の XML コンテンツを作成できます

次のようなものをサポートします。

  • 名前空間の使用
  • 1 つの要素内のテキスト ノードの開始と終了
  • 属性コンテンツをフォーマットする関数 (完全な lxml サンプルの func CLASS を参照)

リストで非常に読みやすい構造を許可します

例えば:

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 の唯一の欠点は、コンパイルする必要があることです。ほんの一瞬で wheel 形式のパッケージから lxml をインストールする方法の詳細については、SO の回答を参照してください。

于 2014-04-17T21:32:13.397 に答える
3

SAX - Simple API for XMLPython ライブラリでの実装を強くお勧めします。XMLここで以前のポスターで説明されているように、それらはセットアップして大きなものを処理するのがかなり簡単で、スタイルパーサーのAPI検証とは異なり、メモリ フットプリントが小さくなります。DOMXML

于 2012-12-12T03:25:50.733 に答える
2

XMLを処理する.NETの方法は、あるバージョンのMSXMLに基づいていると思います。その場合、たとえば、minidomを使用すると、ある程度くつろげると思います。ただし、実行しているのが単純な処理である場合は、どのライブラリでも実行できる可能性があります。

また、PythonでXMLを処理する場合は、非常に優れたライブラリであるElementTreeを使用することを好みます。

于 2008-09-16T06:20:01.683 に答える
2

SOAP メッセージを作成する場合は、soaplibを確認してください。内部では ElementTree を使用しますが、メッセージのシリアル化と逆シリアル化のためのよりクリーンなインターフェイスを提供します。

于 2008-10-13T22:17:10.467 に答える