ホームページ  >  記事  >  バックエンド開発  >  Python XML解析

Python XML解析

高洛峰
高洛峰オリジナル
2016-11-23 13:58:061133ブラウズ

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)

pyhton 標準ライブラリには、SAX パーサーがイベント駆動型モデルを使用して XML を解析します。処理 イベントを 1 つずつトリガーし、ユーザー定義のコールバック関数を呼び出して XML ファイルを処理します。

2.DOM(Document Object Model)

は、XMLデータをメモリ上のツリーに解析し、ツリー上で操作することでXMLを操作します。

3.ElementTree (要素ツリー)

ElementTree は、便利でフレンドリーな API を備えた軽量 DOM のようなものです。コードは使いやすく、高速で、メモリ消費量が少なくなります。

注: DOM は XML データをメモリ内のツリーにマップする必要があるため、比較的遅く、より多くのメモリを消費します。XML ファイルの SAX ストリーミング読み取りの方が高速で、使用するメモリも少なくなりますが、ユーザーはコールバック関数を実装する必要があります。 (ハンドラ)。

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

<コレクション棚="新着商品">

<映画タイトル="背後の敵">

<タイプ>戦争、スリラー

<フォーマット>DVD

<年>2003

<評価>PG

10

日米戦争について話します

<映画タイトル="トランスフォーマー">

アニメ、サイエンス フィクション< /type>

DVD

1989

<評価>R

<星>8<星&Gt ;

< ;description>科学小説

アニメ、アクション

<フォーマット> /フォーマット>

<エピソード>gt;/エピソード>

<評価>PG

<星>10

<説明>ヴァッシュ・ザ・スタンピード!

コメディ

VHS

< ;評価 >PG< /評価>

<星>2

<説明>閲覧可能な退屈

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

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

SAX を使用した XML ドキュメントの解析には、パーサーとイベント ハンドラーの 2 つの部分が含まれます。

パーサーは、XML ドキュメントを読み取り、要素開始イベントや要素終了イベントなどのイベント プロセッサにイベントを送信する役割を担います。

イベント プロセッサは、イベントに応答し、渡された XML データを処理する役割を担います。

1. 大きなファイルを処理します。

2. ファイルの一部のみが必要、またはファイルの特定の情報のみが必要です。

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])

parameter説明:

xmlfile -xmlファイル名

contenthandler-contenthan dlerオブジェクトでなければなりません

errorhandler - このパラメーターが指定されている場合、errorhandler は SAX ErrorHandler オブジェクトである必要があります。

parseString メソッド

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

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

パラメーターの説明:

xmlstring - XML 文字列

contenthandler - ContentHandler オブジェクトである必要があります

errorhandler - このパラメーターが指定されている場合、errorhandler は SAX ErrorHandler オブジェクトである必要があります

Python Parse XMLインスタンス

#!/usr/bin/python

import xml.sax

class MovieHandler( xml.sax.ContentHandler ):

def __init__(self):

self .CurrentData = ""

self.type .

場合tag == "Movie":

print "*****"

emovie **** currentdata == "type":

currentdata == "year":

t印刷 "start:"、self.stars

elf seld.currentdata == "説明": "" "、self.descript

self.currentdata ="

defcharacters(self, content):

if self.CurrentData == "type":

self.type = content

elif self.CurrentData == "format":

self.format = content

elif CurrentData == 「年」:

self.year = content

elif self.CurrentData == 「評価」:

self.評価 = コンテンツ

elif self.CurrentData == "stars":

self.stars = content

elif self.CurrentData == "description":

self.description = content

if ( __name__ == "__main __"):

# 创建一 XMLReader

parser = xml.sax.make_parser()

# namepsacesをオフにする

parser.setFeature(xml.sax.handler.feature_namespaces, 0)

# 重写 ContextHandler

Handler = MovieHandler ()

parser.setContentHandler( Handler )

parser.parse("movies.xml")

以上代码执行结果如下:

*****映画** ***

タイトル: 背後の敵

タイプ: 戦争, スリラー

形式: DVD

年: 2003

評価: PG

スター: 10

説明: 日米戦争について話します

* ****映画*****

タイトル: トランスフォーマー

タイプ: アニメ, サイエンス フィクション

形式: DVD

年: 1989

評価: R

スター: 8

説明: 科学フィクション

*****映画*****

タイトル: トライガン

タイプ: アニメ, アクション

フォーマット: DVD

評価: PG

スター: 10

説明: ヴァッシュ・ザ・スタンピード!

*****映画*****

タイトル: イシュタル

タイプ: コメディ

フォーマット: VHS

評価: PG

スター: 2

説明: 視聴可能な退屈

完整ったSAX API 文档蘅Python SAX API

は、xml.dom を解析する xml

文件モデルオブジェクト (Document Object Model、DOM と呼ばれる) を使用し、W3C 組織推論の拡張可能な処理の標準プロセス インターフェイスです。ドム解析器は、XML 文書を解析するときに、文書を一次的に取得し、文書内のすべての要素が保存されている 1 つの構造領域を保持し、その後、DOM が提供するさまざまな関数を利用して文書の内容を取得または変更できます。

Python では、xml.dom.minidom を使用して xml ファイルを解析します。例:

#!/usr/bin/python

from xml.dom.minidom import parse

import xml.dom.minidom

# ミニダム解析器打开 XML 文档

DOMTree = xml.dom.minidom.parse("movies.xml")

コレクション= DOMTree.documentElement

if collection.hasAttribute("shelf"):

print "ルート要素 : %s" % collection.getAttribute("shelf")

# 集合中获取すべての映画

映画 = collection.getElementsByTagName("movie")

# 印打每部电影の详细情報

for movie in movie:

print "*****Movie*****"

if movie.hasAttribut e( "title"):

print "タイトル: %s" % movie.getAttribute("title")

type = movie.getElementsByTagName('type')[0]

print "タイプ: %s" % type.childNodes[0].data

format = movie.getElementsByTagName('format')[0]

print "Format: %s" % format.childNodes[0].data

評価 = movie.getElementsByTagName('評価')[0]

print "評価: %s" % ratings.childNodes[0].data

description = movie.getElementsByTagName('description')[0]

print "説明: %s" % description .childNodes[0].data

上記プログラムの実行結果は以下の通りです:

ルート要素: 新着

*****映画*****

タイトル: 背後の敵

タイプ: 戦争、スリラー

フォーマット: DVD

Rating : PG

Description: 日米戦争について語る

*****映画*****

タイトル: トランスフォーマー

タイプ: アニメ、サイエンスフィクション

フォーマット: DVD

評価: R

説明: 科学フィクション

*****映画*****

タイトル: トライガン

タイプ: アニメ、アクション

フォーマット: DVD

評価: PG

説明:ヴァッシュ・ザ・スタンピード!

*****映画*****

タイトル: イシュタル

タイプ: コメディ

フォーマット: VHS

評価: PG

説明: 視聴可能な退屈


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:Python JSON次の記事:Python JSON