Python-data-persistence-xml-parsers

提供:Dev Guides
移動先:案内検索

Pythonデータの永続性-XMLパーサー

XMLは eXtensible Markup Language の頭字語です。 これは、HTMLやSGMLに非常によく似た、ポータブルでオープンソースのクロスプラットフォーム言語であり、World Wide Web Consortiumによって推奨されています。

これはよく知られているデータ交換形式で、Webサービス、オフィスツール、 Service Oriented Architectures (SOA)などの多数のアプリケーションで使用されています。 XML形式は、機械可読と人間可読の両方です。

標準Pythonライブラリのxmlパッケージは、XML処理用の次のモジュールで構成されています-

Sr.No. Modules & Description
1

xml.etree.ElementTree

ElementTree API、シンプルで軽量なXMLプロセッサ

2

xml.dom

DOM API定義

3

xml.dom.minidom

最小限のDOM実装

4

xml.sax

SAX2インターフェースの実装

5

xml.parsers.expat

Expatパーサーバインディング

XML文書のデータは、ルートと要素から始まるツリーのような階層形式で配置されます。 各要素はツリー内の単一のノードであり、<>タグと</>タグで囲まれた属性があります。 各要素には、1つ以上のサブ要素を割り当てることができます。

以下はXML文書の典型的な例です-

<?xml version = "1.0" encoding = "iso-8859-1"?>
<studentlist>
   <student>
      <name>Ratna</name>
      <subject>Physics</subject>
      <marks>85&lt/marks>
   </student>
   <student>
      <name>Kiran</name>
      <subject>Maths</subject>
      <marks>100</marks>
   </student>
   <student>
      <name>Mohit</name>
      <subject>Biology&lt/subject>
      <marks>92</marks>
   </student>
</studentlist>
*ElementTree* モジュールを使用する場合、最初のステップはツリーのルート要素を設定することです。 各Elementには、タグと、dictオブジェクトであるattribがあります。 ルート要素の場合、attribは空の辞書です。
import xml.etree.ElementTree as xmlobj
root=xmlobj.Element('studentList')

これで、ルート要素の下に1つ以上の要素を追加できます。 各要素オブジェクトは SubElements を持つことができます。 各サブエレメントには、属性とテキストプロパティがあります。

student=xmlobj.Element('student')
   nm=xmlobj.SubElement(student, 'name')
   nm.text='name'
   subject=xmlobj.SubElement(student, 'subject')
   nm.text='Ratna'
   subject.text='Physics'
   marks=xmlobj.SubElement(student, 'marks')
   marks.text='85'

この新しい要素は、append()メソッドを使用してルートに追加されます。

root.append(student)

上記の方法を使用して、必要な数の要素を追加します。 最後に、ルート要素オブジェクトがファイルに書き込まれます。

tree = xmlobj.ElementTree(root)
   file = open('studentlist.xml','wb')
   tree.write(file)
   file.close()

ここで、XMLファイルを解析する方法を確認します。 そのためには、ElementTreeコンストラクターでファイルパラメーターとしてその名前を指定してドキュメントツリーを構築します。

tree = xmlobj.ElementTree(file='studentlist.xml')

ツリーオブジェクトにはルート要素を取得するための* getroot()*メソッドがあり、getchildren()はその下の要素のリストを返します。

root = tree.getroot()
children = root.getchildren()

各サブ要素に対応するディクショナリオブジェクトは、各子ノードのサブ要素コレクションを反復することによって構築されます。

for child in children:
   student={}
   pairs = child.getchildren()
   for pair in pairs:
      product[pair.tag]=pair.text

次に、各辞書がリストに追加され、辞書オブジェクトの元のリストが返されます。

*SAX* は、イベント駆動型XML解析のための標準インターフェースです。 SAXでXMLを解析するには、xml.sax.ContentHandlerをサブクラス化してContentHandlerが必要です。 関心のあるイベントのコールバックを登録し、パーサーにドキュメントを処理させます。

SAXは、ドキュメントが大きい場合、またはディスクからファイルを読み取るときにファイルを解析するためメモリ制限がある場合に役立ちます。その結果、ファイル全体がメモリに保存されることはありません。

ドキュメントオブジェクトモデル

(DOM)APIは、World Wide Web Consortiumの推奨事項です。 この場合、ファイル全体がメモリに読み込まれ、XMLドキュメントのすべての機能を表すために階層(ツリーベース)形式で格納されます。

大きなファイルを使用するSAX、DOMほど高速ではありません。 一方、多くの小さなファイルでDOMを使用すると、リソースが強制終了される可能性があります。 SAXは読み取り専用ですが、DOMはXMLファイルの変更を許可します。