python XML解析


python XML解析
XMLとは?
XMLは拡張可能なタグ言語(eXtensible Markup Language)を指す.XMLチュートリアルは当駅で学ぶことができます
XMLは、データを転送および格納するように設計されている.
XMLは、ドキュメントを多くの部品に分割し、これらの部品を識別する意味タグを定義するルールです.
メタタグ言語でもあり、特定の分野に関連する他の意味的、構造化されたタグ言語を定義するための構文言語を定義します.
pythonによるXMLの解析
一般的なXMLプログラミングインタフェースにはDOMとSAXがあり、この2つのインタフェースはXMLファイルを処理する方法が異なり、もちろん使用場面も異なります.
pythonには、XML、SAX、DOM、ElementTreeの3つの方法があります.
1.SAX (simple API for XML )
pyhton標準ライブラリにはSAX解析器が含まれており、SAXはイベント駆動モデルで、XMLを解析する過程で個々のイベントをトリガーし、ユーザー定義のコールバック関数を呼び出すことでXMLファイルを処理します.
2.DOM(Document Object Model)
XMLデータをメモリに1つのツリーに解析し、ツリーの操作によってXMLを操作します.
3.ElementTree(メタツリー)
ElementTreeは軽量級のDOMのようで、便利で友好的なAPIを持っています.コードの可用性がよく、速度が速く、消費メモリが少ない.
注意:DOMはXMLデータをメモリのツリーにマッピングする必要があるため、1つは比較的遅い、2つは比較的にメモリを消費するが、SAXはXMLファイルをストリーミングし、比較的速く、メモリを消費するのは少ないが、ユーザーがコールバック関数(handler)を実現する必要がある.
この章で使用するXMLインスタンスファイルmovies.xmlの内容は次のとおりです.


   War, Thriller
   DVD
   2003
   PG
   10
   Talk about a US-Japan war


   Anime, Science Fiction
   DVD
   1989
   R
   8
   A schientific fiction

   
   Anime, Action
   DVD
   4
   PG
   10
   Vash the Stampede!


   Comedy
   VHS
   PG
   2
   Viewable boredom


python SAXを使用してxmlを解析
SAXはイベント駆動に基づくAPIである.
SAX解析XMLドキュメントは、解析器とイベントプロセッサの2つの部分に関連しています.
解析器はXMLドキュメントを読み取り、要素の開始イベントや要素の終了イベントなどのイベントプロセッサにイベントを送信します.
イベントプロセッサは,イベントに対応して伝達されたXMLデータを処理する.
  • 1、大型ファイルを処理する.
  • 2、ファイルの一部のみ、またはファイルから特定の情報を取得するだけです.
  • 3、自分のオブジェクトモデルを作りたいとき.

  • pythonでsax方式でxmlを処理するにはxmlを先に導入する.saxのparse関数、xmlもあります.sax.handlerのContentHandler.
    ContentHandlerクラスメソッドの紹介
    charactersメソッド
    呼び出しタイミング:
    行からラベルに出会う前に文字が存在し、contentの値はこれらの文字列です.
    1つのラベルから、次のラベルに出会う前に文字が存在し、contentの値はこれらの文字列です.
    ラベルから、行の終端に遭遇する前に文字が存在し、contentの値はこれらの文字列です.
    ラベルは、開始ラベルであってもよいし、終了ラベルであってもよい.
    startDocument()メソッド
    ドキュメントが起動されたときに呼び出されます.
    endDocument()メソッド
    解析器がドキュメントの最後に到達したときに呼び出されます.
    startElement(name,attrs)メソッド
    XML開始ラベルに遭遇したときに呼び出されます.nameはラベルの名前で、attrsはラベルの属性値辞書です.
    endElementメソッド
    XML終了ラベルに遭遇したときに呼び出されます.
    make_parserメソッド
    次の方法では、新しい解析オブジェクトを作成して返します.
    xml.sax.make_parser( [parser_list] )

    パラメータの説明:
  • parser_List-オプションパラメータ、解析器リスト
  • parserメソッド
    次の方法でSAX解析を作成し、xmlドキュメントを解析します.
    xml.sax.parse( xmlfile, contenthandler[, errorhandler])

    パラメータの説明:
  • xmlfile-xmlファイル名
  • contenthandler-ContentHandlerのオブジェクトである必要があります
  • errorhandler-このパラメータを指定する場合、errorhandlerはSAX ErrorHandlerオブジェクト
  • である必要があります.
    parseStringメソッド
    parseStringメソッドXML解析器を作成し、xml文字列を解析します.
    xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

    パラメータの説明:
  • xmlstring-xml文字列
  • contenthandler-ContentHandlerのオブジェクトである必要があります
  • errorhandler-このパラメータを指定する場合、errorhandlerはSAX ErrorHandlerオブジェクト
  • である必要があります.
    Python解析XMLインスタンス
    #!/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 = ""
    
       #       
       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 APIsを参照してください
    xmlを使用します.dom解析xml
    ファイルオブジェクトモデル(Document Object Model、略称DOM)は、W 3 C組織が推奨する拡張可能なスケーリング言語の処理のための標準的なプログラミングインターフェースである.
    DOMの解析器は、XMLドキュメントを解析するときに、ドキュメント全体を一度に読み取り、ドキュメント内のすべての要素をメモリのツリー構造に保存します.その後、DOMが提供する異なる関数を利用して、ドキュメントの内容と構造を読み取りたり変更したりすることができます.また、変更した内容をxmlファイルに書き込むこともできます.
    pythonではxmlを使用します.dom.minidomはxmlファイルを解析します.例は次のとおりです.
    #!/usr/bin/python
    
    from xml.dom.minidom import parse
    import xml.dom.minidom
    
    #   minidom      XML   
    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