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 )

Python標準ライブラリにはSAXパーサーが含まれています。SAXはイベント駆動型モデルを使用して、XMLの解析およびユーザー定義のコールバック関数の呼び出しのプロセス中にイベントを1つずつトリガーすることにより、XMLファイルを処理します。

2. DOM(Document Object Model)

XMLデータをメモリ内のツリーに解析し、ツリーの操作を通じてXMLを操作します。

この章で使用するXMLサンプルファイルmovies.xmlの内容は次のとおりです。

< collection shelf="New Arrivals"<movie title="Enemy Behind"<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="Transformers"<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="Trigun"<type Anime, Action</type 
 < format DVD</format 
 < episodes 4</episodes 
 < rating PG</rating 
 < stars 10</stars 
 < description Vash the Stampede!</description 
< /movie 
< movie title="Ishtar"<type Comedy</type 
 < format VHS</format 
 < rating PG</rating 
 < stars 2</stars 
 < description Viewable boredom</description 
< /movie 
< /collection 

PythonはSAXを使用してxmlを解析します

SAXはイベント駆動型APIです。

SAXを使用してXMLドキュメントを解析するには、パーサーとイベントハンドラーの2つの部分が必要です。

パーサーは、XMLドキュメントを読み取り、要素の開始イベントや要素の終了イベントなどのイベントをイベントハンドラーに送信する役割を果たします。

イベントハンドラは、イベントに応答し、渡されたXMLデータを処理する責任があります。

saxを使用してPythonでxmlを処理するには、最初にxml.saxにparse関数を導入し、xml.sax.handlerにContentHandlerを導入する必要があります。

ContentHandlerクラスメソッドの紹介

文字(コンテンツ)メソッド

いつ電話するか:

行から始めて、ラベルに出会う前に文字があり、コンテンツの値はこれらの文字列です。

あるラベルから、次のラベルに出会う前に文字があり、コンテンツの値はこれらの文字列です。

ラベルから、行末文字に遭遇する前に文字があり、コンテンツの値はこれらの文字列です。

タグは、開始タグまたは終了タグにすることができます。

startDocument()メソッド

ドキュメントの開始時に呼び出されます。

endDocument()メソッド

パーサーがドキュメントの最後に到達したときに呼び出されます。

startElement(name、attrs)メソッド

XML開始タグが検出されたときに呼び出されます。nameはタグの名前であり、attrsはタグの属性値ディクショナリです。

endElement(name)メソッド

**XML終了タグが検出されたときに呼び出されます。 ****

make_parserメソッド

次のメソッドは、新しいパーサーオブジェクトを作成して戻ります。

xml.sax.make_parser([parser_list])

パラメータの説明:

パーサー方式

次のメソッドは、SAXパーサーを作成し、xmlドキュメントを解析します。

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

パラメータの説明:

parseStringメソッド

parseStringメソッドは、XMLパーサーを作成し、xml文字列を解析します。

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

パラメータの説明:

PythonによるXMLインスタンスの解析

#! /usr/bin/python3

import xml.sax

classMovieHandler( 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()
 # 名前名を閉じる
 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 SAXAPIを参照してください。

**xml.domを使用してxml **を解析します

ドキュメントオブジェクトモデル(DOM)は、W3C組織が推奨する拡張可能なマークアップ言語を処理するための標準プログラミングインターフェイスです。

DOMパーサーがXMLドキュメントを解析するとき、ドキュメント全体を一度に読み取り、ドキュメント内のすべての要素をメモリ内のツリー構造に格納します。次に、DOMが提供するさまざまな機能を使用して、ドキュメントを読み取ったり変更したりできます。変更したコンテンツをxmlファイルに書き込むこともできます。

pythonでは、xml.dom.minidomを使用してxmlファイルを解析します。例は次のとおりです。

#! /usr/bin/python3

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

完全なDOMAPIドキュメントについては、Python DOMAPIを参照してください。

上記は、PythonがXMLを解析する方法の詳細な内容です。PythonのXML解析の詳細については、ZaLou.Cnの他の関連記事に注意してください。

Recommended Posts

PythonがXMLを解析する方法
Pythonは単純なXMLデータを解析します
Pythonはどのようにxmlファイルを生成しますか
pythonがどのように発明されたか
pythonコードにコメントする方法
Pythonが文字列の大文字小文字を変換する方法
Pythonはどのように整数を出力しますか
pythonはどのようにバックスラッシュを出力しますか
pythonをすばやく学ぶ方法
pythonプラグインをアンインストールする方法
PythonがFTP機能を実装する方法
pythonオブジェクトを理解する方法
パイソンタプルの使い方
pythonはパッケージをどのように更新しますか
pythonがパッケージパッケージを参照する方法を説明する
pythonはどのようにマトリックス操作を実行しますか
Pythonはどのように更新値を一覧表示しますか
pythonウェブページコードの表示方法
pythonスレッドプールの使用方法
Pythonがメール機能を実装する方法
pythonはどのように環境を変えますか
python設定ファイルの書き方
pythonコードでラップする方法
Pythonで括弧を省略する方法
CentOS8にPython3.8をインストールする方法
Ubuntu18.04にPython3.8をインストールする方法
pythonでクラスを書く方法
pythonはjavaクラスをどのように呼び出しますか
PythonでExcelを読む方法
pythonは依存関係パッケージをどのようにインポートしますか
python dict garbledを解決する方法
pythonでエラーを表示する方法
pythonはどのようにインタラクティブモードに入りますか
pythonでreturnを書く方法
Pythonがファイルディレクトリでどのように動作するか
Pythonがタイマー機能を実装する方法
pythonモジュールを表示する方法
Pythonで変数を理解する方法
pythonオブジェクト指向プログラミングを理解する方法
pythonはどのように素数を決定しますか
PythonでSQLiteを使用する方法
pythonのインストールが成功したことを確認する方法
Pythonで地球を作る方法
およびおよびまたはPythonでの使用方法
pythonでキャッシュファイルを削除する方法
Pythonでサードパーティモジュールを導入する方法
pythonはどのように計算速度を向上させますか
pythonでnull値を表す方法
pythonでテキストファイルを保存する方法
PYTHONを使用してニュース記事をクロールする方法
pythonでwinプログラムを書く方法
pythonでid関数を実行する方法
Pythonでサードパーティモジュールをインストールする方法
pythonでエラーをカスタムキャッチする方法
pythonでtryステートメントを書く方法
Pythonでプライベート属性を定義する方法
R&D:CentOS7にPython3をインストールする方法
pythonはどのように独自の関数を呼び出すのですか
Pythonでカスタムモジュールを追加する方法
Pythonはjsonモジュールをどのように処理しますか
pythonでexcelテーブルを処理する方法