PythonでElementTreeでXMLを解析


【XML基本概念紹介】XMLは拡張可能なタグ言語(eXtensible Markup Language)を指す.XMLは、データを転送および格納するように設計されている.
コンセプト1:
      # foo       
     # foo       
           # note:                     ,      

概念2:
           #            
     # bar   foo      
          #    foo     

コンセプト3:
                  # foo    lang   ,     : EN;  Python  (Name-Value) ;                            
   # bar    lang   ,     : CH;   id  ,  :001,   '' “” ; 
                           # bar    lang     foo      ,            ;

コンセプト4:
Learning Python #          
                                # Note:             ,      ,     。

コンセプト5:
                                  # info      
     A            # list      
     B  
     C 

コンセプト6:
  #       xmlns         ,feed    http://www.w3.org/2005/Atom     
  dive into mark             # title    。                    ,              

xmlns:prefix宣言によって名前空間を定義し、prefixという名前を付けることもできます.
次に、名前空間の各要素は、このプレフィックス(prefix)を明示的に使用して宣言する必要があります.
  # feed      atom
  dive into mark             # title                      
                                          # xmlns(XML Name Space)

【XMLのいくつかの解析方法】
一般的なXMLプログラミングインタフェースにはDOMとSAXがあり、この2つのインタフェースはXMLファイルを処理する方法が異なり、使用場面も自然に異なります.PythonはXML:SAX、DOM、ElementTree:1を解析する3つの方法がある.SAX(Simple API for XML)Pyhton標準ライブラリにはSAX解析器が含まれており、SAXはイベント駆動モデルで、XMLを解析する過程で個々のイベントをトリガーし、ユーザー定義のコールバック関数を呼び出すことでXMLファイルを処理する.SAXはイベント駆動に基づくAPIである.SAX解析XMLドキュメントは、解析器とイベントプロセッサの2つの部分に関連しています.解析器はXMLドキュメントを読み取り、要素の開始イベントや終了イベントなどのイベントプロセッサにイベントを送信します.イベントプロセッサは、イベントの処理を担当します.
利点:SAXストリーム式XMLファイルの読み取りが速く、メモリの消費量が少ない.
欠点:ユーザがコールバック関数(handler)を実装する必要がある.
2.DOM(Document Object Model)はXMLデータをメモリ内で1つのツリーに解析し、ツリーの操作によってXMLを操作する.DOMの解析器は、XMLドキュメントを解析するときに、ドキュメント全体を一度に読み取り、ドキュメント内のすべての要素をメモリのツリー構造に保存します.その後、DOMが提供する異なる関数を利用して、ドキュメントの内容と構造を読み取りたり変更したりすることができます.また、変更した内容をxmlファイルに書き込むこともできます.
利点:DOMを使用する利点は、各ノードが親ノード、子ノードを知っているため、ステータスを追跡する必要がないことです.
欠点:DOMはXMLデータをメモリにマッピングするツリーが必要です.1つは遅いこと、2つはメモリを消費することです.使用するのも面倒です.3.ElementTree(メタツリー)ElementTreeは軽量級のDOMのようで、便利で友好的なAPIを持っています.コードの可用性がよく、速度が速く、消費メモリが少ない.
それに比べて、3つ目の方法は、便利で、迅速で、私たちはずっとそれを使っています.要素ツリーでXMLを解析する方法を説明します.
【ElementTree解析】
2つの実装
ElementTreeはXMLを処理するために生まれ、Python標準ライブラリに2つの実装があります.
1つは、純Python実装、例えばxmlである.etree.ElementTree 
もう1つは速度が速い:xml.etree.cElementTree
できるだけC言語で実現したものは、速度が速く、消費メモリが少ないためです.プログラムには次のように書くことができます.
try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET

一般的な方法
#         , attrib  。
#         , text  。
#         , tag  。

サンプルXML


   Book message
    
        bookone
        python check
        001
        200
    
    
        booktwo
        python learn
        002
        300
    

###########
##XMLのロード
##########メソッド1:ファイルのロード
root = ET.parse('book.xml')

メソッド2:文字列のロード
root = ET.fromstring(xmltext)

###########
##ノードの取得
###########
メソッド1:指定したノードを取得する->getiterator()メソッド
book_node = root.getiterator('list')

メソッド2:指定したノードを取得する->findall()メソッド
book_node = root.findall('list')

メソッド3:指定したノードを取得する->find()メソッド
book_node = root.find('list')

方法4:息子ノードの取得->getchildren()
for node in book_node:
    book_node_child = node.getchildren()[0]
    print book_node_child.tag, '=> ', book_node_child.text

###########
##例01
###########
# coding=utf-8

try:                                           #     
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET

root   = ET.parse('book.xml')                 #   XML  
books  = root.findall('/list')                #          list    
for book_list in books:                       #          
    print "=" * 30                            #                
    for book in book_list:                    #            ,                               
        if book.attrib.has_key('id'):         #   id      
            print "id:", book.attrib['id']    #   id      
        print book.tag + '=> ' + book.text    #          
print "=" * 30

出力結果:
==============================
head=> bookone
name=> python check
number=> 001
page=> 200
==============================
head=> booktwo
name=> python learn
number=> 002
page=> 300
==============================