> ⑧Python XML処理 – ネットワークエンジニアチュートリアル

⑧Python XML処理

スポンサーリンク

無料でプログラマへ!30歳までなら無料でプログラミング学校に通うことが出来ます。下の画像をクリックして無料相談会でGO!

Python XML処理

XMLは移植性の高いオープンソース言語であり、プログラマーは、オペレーティングシステムや開発言語にかかわらず、他のアプリケーションが読むことができるアプリケーションを開発することができます。

XMLとは?

Extensible Markup Language(XML)は、HTMLやSGMLによく似たマークアップ言語です。これはWorld Wide Web Consortiumで推奨されており、オープンスタンダードとして利用できます。

XMLは、SQLベースのバックボーンを必要とせずに、小規模から中規模のデータを追跡するのに非常に役立ちます。

XMLパーサのアーキテクチャとAPI

Pythonの標準ライブラリは、XMLで動作する最小限にもかかわらず有用なインタフェースを提供します。

XMLデータに対する最も基本的で広く使われているAPIの2つは、SAXとDOMのインタフェースです。

  • XML(SAX)用のシンプルAPI:ここでは、関心のあるイベントのコールバックを登録して、パーサーがドキュメントを処理するようにします。これは、ドキュメントが大容量である場合やメモリの制限がある場合、ファイルをディスクから読み取って解析し、ファイル全体がメモリに格納されない場合に便利です。
  • DOM(Document Object Model)API:ファイル全体がメモリに読み込まれ、XML文書のすべての機能を表す階層(ツリーベース)形式で格納される、World Wide Web Consortiumの推奨事項です。

大規模なファイルを扱う場合、SAXはDOMほど高速に情報を処理できません。一方、DOMの場合ですと小さなファイルが多数使用されている場合は、リソースを有効に使用できなくなります。

SAXは読み取り専用ですが、DOMではXMLファイルを変更できます。これら2つの異なるAPIは文字通りお互いを補完するので、大規模なプロジェクトの両方で使用できます

XMLコード例については、単純なXMLファイルmovies.xmlを入力として使用しましょう。

<collection shelf="New Arrivals">
<movie title="男はつらいよ">
   <type>War, Thriller</type>
   <format>DVD</format>
   <year>2003</year>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Talk about a US-Japan war</description>
</movie>
<movie title="男はつらいよ2">
   <type>Anime, Science Fiction</type>
   <format>DVD</format>
   <year>1989</year>
   <rating>R</rating>
   <stars>8</stars>
   <description>A schientific fiction</description>
</movie>
   <movie title="男はつらいよ3">
   <type>Anime, Action</type>
   <format>DVD</format>
   <episodes>4</episodes>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Vash the Stampede!</description>
</movie>
<movie title="男はつらいよ4">
   <type>Comedy</type>
   <format>VHS</format>
   <rating>PG</rating>
   <stars>2</stars>
   <description>Viewable boredom</description>
</movie>
</collection>

SAX APIを使用したXMLの解析

SAXは、イベントドリブンXML解析の標準インタフェースです。SAXを使用してXMLを解析するには、通常、xml.sax.ContentHandlerをサブクラス化して独自のContentHandlerを作成する必要があります。

アプリケーションにとって最も重要なメインの SAX コールバック・インターフェースです。このインターフェースで発生するイベントの順序はドキュメント内の情報の順序を反映しています

メソッドstartDocumentendDocumentは、XMLファイルの先頭と末尾に呼び出されます。

メソッド文字(テキスト)は、パラメータテキストを介してXMLファイルの文字データに渡されます。

ContentHandlerは各要素の先頭と最後で呼び出されます。パーザが名前空間モードでない場合、メソッドstartElement(tag、attributes)endElement(tag)が呼び出されます。それ以外の場合は、対応するstartElementNSメソッドendElementNSメソッドが呼び出されます。ここで、tagは要素タグであり、attributesはAttributesオブジェクトです。

先に進む前に理解しておくべき他の重要な方法 –

make_parserの方法

次のメソッドは、新しいパーサオブジェクトを作成し、それを返します。作成されたパーサーオブジェクトは、システムが最初に見つけたパーサータイプになります。

xml.sax.make_parser( [parser_list] )

パラメータの詳細は次のとおりです。

  • parser_list:すべてのmake_parserメソッドを実装する必要のあるパーサーのリストからなるオプションの引数。

解析方法

以下のメソッドは、SAXパーサを作成し、それを使ってドキュメントを解析します。

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

ここにパラメータの詳細があります –

  • xmlfile:これは読み込むXMLファイルの名前です。
  • contenthandler:これはContentHandlerオブジェクトでなければなりません。
  • errorhandler:指定された場合、エラーハンドラはSAX ErrorHandlerオブジェクトでなければなりません。

parseString方法

SAXパーサを作成し、指定されたXML文字列を解析するもう1つの方法があります。

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

ここにパラメータの詳細があります –

  • xmlstring:読み込むXML文字列の名前です。
  • contenthandler:これはContentHandlerオブジェクトでなければなりません。
  • errorhandler:指定された場合、エラーハンドラはSAX ErrorHandlerオブジェクトでなければなりません。

#!/usr/bin/python

import xml.sax

class MovieHandler( xml.sax.ContentHandler ):
   def __init__(self):
      self.CurrentData = ""
      self.type = ""
      self.format = ""
      self.year = ""
      self.rating = ""
      self.stars = ""
      self.description = ""

   # エレメントがスタートした時呼び出される
   def startElement(self, tag, attributes):
      self.CurrentData = tag
      if tag == "movie":
         print "*****Movie*****"
         title = attributes["title"]
         print "Title:", title

   ## エレメントが終了した時呼び出される
   def endElement(self, tag):
      if self.CurrentData == "type":
         print "Type:", self.type
      elif self.CurrentData == "format":
         print "Format:", self.format
      elif self.CurrentData == "year":
         print "Year:", self.year
      elif self.CurrentData == "rating":
         print "Rating:", self.rating
      elif self.CurrentData == "stars":
         print "Stars:", self.stars
      elif self.CurrentData == "description":
         print "Description:", self.description
      self.CurrentData = ""

   #charactersを呼び出す時に使われる
   def characters(self, content):
      if self.CurrentData == "type":
         self.type = content
      elif self.CurrentData == "format":
         self.format = content
      elif self.CurrentData == "year":
         self.year = content
      elif self.CurrentData == "rating":
         self.rating = content
      elif self.CurrentData == "stars":
         self.stars = content
      elif self.CurrentData == "description":
         self.description = content
  
if ( __name__ == "__main__"):
   
   # XMLReaderを作る
   parser = xml.sax.make_parser()
   # turn off namepsaces
   parser.setFeature(xml.sax.handler.feature_namespaces, 0)

   # ContextHandlerを継承する
   Handler = MovieHandler()
   parser.setContentHandler( Handler )
   
   parser.parse("movies.xml")

これは、

*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom

SAX APIのドキュメントの詳細については、標準のPython SAX APIを参照してください。

DOM APIを使用したXMLの解析

DOM(Document Object Model)は、XML文書にアクセスして変更するためのW3C(World Wide Web Consortium)のクロスランゲージAPIです。

DOMは、ランダムアクセスアプリケーションに非常に便利です。SAXでは、ドキュメントの1ビットを一度に見ることができます。1つのSAX要素を調べている場合、別のSAX要素にアクセスすることはできません。

ここで、XML文書を素早くロードし、xml.domモジュールを使用してミニドームオブジェクトを作成する最も簡単な方法があります。minidomオブジェクトは、XMLファイルからDOMツリーを素早く作成する簡単なパーサメソッドを提供します。

サンプルフレーズは、minidomオブジェクトのparse(file [、parser])関数を呼び出し、fileで指定されたXMLファイルをDOMツリーオブジェクトに解析します。

#!/usr/bin/python

from xml.dom.minidom import parse
import xml.dom.minidom

# XML documentを開くためminidom parserを使う
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
   print "Root element : %s" % collection.getAttribute("shelf")

# 映画の名前全部を読み込む
movies = collection.getElementsByTagName("movie")

#一本一本の映画の内容を読み込む.
for movie in movies:
   print "*****Movie*****"
   if movie.hasAttribute("title"):
      print "Title: %s" % movie.getAttribute("title")

   type = movie.getElementsByTagName('type')[0]
   print "Type: %s" % type.childNodes[0].data
   format = movie.getElementsByTagName('format')[0]
   print "Format: %s" % format.childNodes[0].data
   rating = movie.getElementsByTagName('rating')[0]
   print "Rating: %s" % rating.childNodes[0].data
   description = movie.getElementsByTagName('description')[0]
   print "Description: %s" % description.childNodes[0].data

これは、次の結果になります

Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom

前のページ⑦Pythonマルチスレッドプログラミング

次のページ⑨

スポンサーリンク

ネットワークエンジニアになりたければ下記から無料相談会に参加!
なんと無料で授業を受けれてエンジニアになれます

投稿日:

執筆者: