Adblockを無効にします

AdBlockはサイト上のコンテンツをブロックしています

ADBlock errore

質問

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

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

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

解決

個人的に、私はXMLが重いプロジェクトの組み込みオプションのいくつかで遊んで、 pulldom は、それほど複雑でないドキュメントに最適です。

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

好きなこと:コールバックを使用するのではなく、forループで解析を処理できます。また、完全な解析(<!> quot; pull <!> quot;部分)を遅らせ、expandNode()を呼び出すときにのみ追加の詳細を取得します。これは、私の<!> quot; responsible <!> quot;の一般的な要件を満たしています。使いやすさとシンプルさを犠牲にすることなく効率化。

他のヒント

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

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

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

Pythonで簡単にパッケージ化したい場合は、minidomが答えですが、それはかなり不自由です。ドキュメントは<!> quot;こちらはdomのドキュメントです、理解してください<!> quot;。本当に迷惑です。

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

saxシステムを使用しましたが、多くの点で<!> quot; pythonic <!> quot;しかし、私は通常、それらを処理するための状態ベースのシステムを作成することになり、その方法は狂気(およびバグ)にあります。

研究が好きならミニドムで、うまく機能する良いコードが欲しいならElementTreeで行きましょう。

複数のプロジェクトでElementTreeを使用しましたが、推奨しています。

Python 2.5にはpythonicが付属しています。cバージョンcElementTree(xml.etree.cElementTree)は、純粋なPythonバージョンの20倍の速さで、非常に使いやすいです。

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

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

ドキュメントの複雑さが少し異なります。

XMLの記述にはminidomを多く使用しましたが、それは通常、文書を読んで、いくつかの単純な変換を行い、それらを書き戻すことです。 (XMLを適切に解析しない古代のアプリケーションを満たすために)要素属性を順序付ける機能が必要になるまで、それは十分に機能しました。その時点で、私はあきらめてXMLを自分で書きました。

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

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

<!> quot;かなりシンプルな<!> quot; XML、 minidomモジュール( Python標準ライブラリ)はおそらくあなたのニーズに合うでしょう。 XMLのDOM表現の経験がある場合は、APIを非常に簡単に見つけることができます。

XMLリクエストを受信し、XMLレスポンスを作成するSOAPサーバーを作成します。 (残念ながら、それは私のプロジェクトではないため、クローズドソースですが、それは別の問題です)。

<!> quot; fits <!> quot;というデータ構造がある場合、(SOAP)XMLドキュメントの作成は非常に簡単であることがわかりました。スキーマ。

応答エンベロープは(ほぼ)要求エンベロープと同じなので、エンベロープを保持します。次に、私のデータ構造は(おそらくネストされた)辞書なので、この辞書を<!> lt; key <!> gt; value <!> lt; / key <!> gt;に変換する文字列を作成します。アイテム。

これは再帰が簡単にするタスクであり、正しい構造になります。これはすべてPythonコードで行われ、現在は実稼働で使用するのに十分な速度です。

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

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

PythonでXMLを真剣に使用するには、lxmlを使用します

PythonにはElementTreeビルトインライブラリが付属していますが、lxmlは速度と機能(スキーマ検証、サックス解析、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: &lt;spam&amp;egg&gt;.</p>
  </body>
</html>

E-factoryがそれに従っていることに感謝します

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

読みやすさのカウント。

XMLコンテンツの作成を許可

次のようなものをサポートしています:

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

リストを含む非常に読みやすい構造を許可

e.g。:

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

SAX - Simple API for XML-Pythonライブラリでの実装を強くお勧めします。前のポスターで説明したように、これらは駆動​​されたXMLでも大きなAPIのセットアップと処理がかなり簡単で、DOMスタイル<=>パーサーの検証とは異なり、メモリフットプリントが低くなります。

XMLを処理する.Netの方法は、MSXMLの一部のバージョンに基づいていると想定しています。その場合、たとえばminidomを使用すると、少し居心地が良くなると思います。ただし、単純な処理であれば、おそらくライブラリを実行します。

Pythonでxmlを処理するときにElementTreeを使用することも好みます。これは非常に洗練されたライブラリです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow