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 (XML 用の単純な API)
Python 標準ライブラリには SAX パーサーが含まれており、SAX は次のプロセスを通じてイベント駆動型モデルを使用します。 XML の解析 イベントを 1 つずつトリガーし、ユーザー定義のコールバック関数を呼び出して XML ファイルを処理します。
2.DOM(Document Object Model)
は、XMLデータをメモリ上のツリーに解析し、ツリー上で操作することでXMLを操作します。
3.ElementTree (要素ツリー)
ElementTree は、便利でフレンドリーな API を備えた軽量 DOM のようなものです。コードは使いやすく、高速で、メモリ消費量が少なくなります。
注: DOM は XML データをメモリ内のツリーにマップする必要があるため、第一に比較的遅く、第二に、XML ファイルの SAX ストリーミング読み取りの方が高速でメモリ消費量が少なくなりますが、より多くのメモリを消費します。ユーザー実装のコールバック関数 (ハンドラー)。
この章で使用される XML サンプル ファイル movie.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 データを処理する役割を担います。
<psax は次の問題の処理に適しています: < p="">- 1. ファイルのコンテンツの一部のみが必要であるか、のみが必要です。ファイル固有の情報から。
- 3. 独自のオブジェクトモデルを構築したい場合。
- sax を使用して Python で xml を処理するには、まず xml.sax に parse 関数を導入し、xml.sax.handler に ContentHandler を導入する必要があります。 ContentHandlerクラスのメソッド紹介
characters(content)メソッド
呼び出しタイミング:ラベルに遭遇する前の行から始まり、文字があり、contentの値はこれらの文字列です。
あるラベルから次のラベルに出会うまでに文字があり、コンテンツの値はこれらの文字列です。 ラベルから、行終端記号に遭遇する前に文字があり、コンテンツの値はこれらの文字列です。 タグは開始タグまたは終了タグのいずれかになります。startDocument() メソッド
は、ドキュメントの開始時に呼び出されます。endDocument()メソッド
パーサーがドキュメントの最後に到達すると呼び出されます。
startElement(name, attrs) メソッド
は、XML 開始タグが見つかったときに呼び出されます。 name はタグの名前であり、attrs はタグの属性値ディクショナリです。
endElement(name) メソッド
は、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 # -*- coding: UTF-8 -*- 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 API を参照してください
xml.dom を使用する xml の解析
ドキュメント オブジェクト モデル (DOM) は、拡張可能なマークアップ言語を処理するために W3C 組織によって推奨されている標準プログラミング インターフェイスです。
XML ドキュメントを解析するとき、DOM パーサーはドキュメント全体を一度に読み取り、ドキュメント内のすべての要素をメモリ内のツリー構造に保存します。その後、DOM が提供するさまざまな関数を使用してコンテンツを読み取りまたは変更できます。ドキュメントの構造や変更を行うか、変更した内容を XML ファイルに書き込みます。
xml.dom.minidom は、Python で XML ファイルを解析するために使用されます。例は次のとおりです:
#!/usr/bin/python # -*- coding: UTF-8 -*- 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
完全な DOM API ドキュメントについては、Python DOM を参照してください。 API。