XML は、拡張可能なマークアップ言語 (eXtensible Markup Language) を指します。
XML はデータを送信および保存するように設計されています。
XML は、ドキュメントをコンポーネントに分割し、それらのコンポーネントを識別するセマンティック マークアップを定義する一連のルールです。
これはメタ マークアップ言語でもあります。つまり、特定のフィールドに関連する他のセマンティックおよび構造化マークアップ言語を定義するための構文言語を定義します。
一般的なXMLプログラミングインターフェースこれらの2つのインターフェースはDOMとSAXがあり、XMLファイルを異なる方法で処理し、当然使用シナリオも異なります。
python には、XML、SAX、DOM、および ElementTree を解析するための 3 つのメソッドがあります:
Python 標準ライブラリには SAX パーサーが含まれており、SAX は event によって駆動されます モデル は、XML の解析プロセス中にイベントを 1 つずつトリガーし、ユーザー定義の コールバック関数 を呼び出すことによって、XML ファイルを処理します。
は、XML データをメモリ上のツリーに解析し、ツリー上で操作することで XML を操作します。
ElementTree は、便利でフレンドリーな API を備えた軽量 DOM のようなものです。コードは使いやすく、高速で、メモリ消費量が少なくなります。
注: DOM は XML データをメモリ内のツリーにマップする必要があるため、第一に比較的遅く、第二に、XML ファイルの SAX ストリーミング読み取りの方が高速でメモリ消費量が少なくなりますが、より多くのメモリを消費します。ユーザー実装のコールバック関数 (handler)。
この章で使用される 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>
SAX はイベント駆動型 API です。
SAX を使用した XML ドキュメントの解析には、パーサーとイベント ハンドラーの 2 つの部分が含まれます。
パーサーは、XML ドキュメントを読み取り、要素開始イベントや要素終了イベントなどのイベント プロセッサにイベントを送信する役割を担います。
イベント プロセッサは、イベントに応答し、渡された XML データを処理する役割を担います。
1. 大きなファイルを処理します。
2. ファイルの一部のみが必要、またはファイルの特定の情報のみが必要です。
3. 独自の オブジェクトモデルを作成したい場合。
sax を使用して Python で xml を処理するには、まず xml.sax に parse 関数を導入し、xml.sax.handler に ContentHandler を導入する必要があります。
characters(content)メソッド
呼び出しタイミング:
ラベルに遭遇する前の行から始まり、文字があり、contentの値はこれらの文字列です。
あるラベルから次のラベルに出会うまでに文字があり、コンテンツの値はこれらの文字列です。
ラベルから、行終端記号に遭遇する前に文字があり、コンテンツの値はこれらの文字列です。
タグは開始タグまたは終了タグにすることができます。
startDocument()メソッド
は、ドキュメントの開始時に呼び出されます。
endDocument() メソッド
は、パーサーがドキュメントの終わりに到達すると呼び出されます。
startElement(name, attrs) メソッド
は、XML 開始タグが見つかったときに呼び出されます。name はタグの名前であり、attrs はタグの attributesvalue ディクショナリです。
endElement(name)メソッド
は、XML終了タグが見つかったときに呼び出されます。
次のメソッドは、新しいパーサー オブジェクトを作成して返します。
xml.sax.make_parser( [parser_list] )
パラメータの説明:
parser_list - オプションのパラメータ、パーサーリスト
次のメソッドは、SAX パーサーを作成し、XML ドキュメントを解析します:
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
パラメーターの説明:
xmlfile - XML ファイル名
contenthandler - ContentHandler オブジェクトである必要があります
errorhandler - 如果指定该参数,errorhandler必须是一个SAX ErrorHandler对象
parseString方法创建一个XML解析器并解析xml字符串:
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
参数说明:
xmlstring - xml字符串
contenthandler - 必须是一个ContentHandler的对象
errorhandler - 如果指定该参数,errorhandler必须是一个SAX ErrorHandler对象
#!/usr/bin/python# -*- coding: UTF-8 -*-import xml.saxclass 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 BehindType: War, ThrillerFormat: DVDYear: 2003Rating: PGStars: 10Description: Talk about a US-Japan war*****Movie*****Title: TransformersType: Anime, Science FictionFormat: DVDYear: 1989Rating: RStars: 8Description: A schientific fiction*****Movie*****Title: TrigunType: Anime, ActionFormat: DVDRating: PGStars: 10Description: Vash the Stampede!*****Movie*****Title: IshtarType: ComedyFormat: VHSRating: PGStars: 2Description: Viewable boredom
文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。
一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。
python中用xml.dom.minidom来解析xml文件,实例如下:
#!/usr/bin/python# -*- coding: UTF-8 -*-from xml.dom.minidom import parseimport xml.dom.minidom# 使用minidom解析器打开 XML 文档DOMTree = xml.dom.minidom.parse("movies.xml")collection = DOMTree.documentElementif 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 BehindType: War, ThrillerFormat: DVDRating: PGDescription: Talk about a US-Japan war*****Movie*****Title: TransformersType: Anime, Science FictionFormat: DVDRating: RDescription: A schientific fiction*****Movie*****Title: TrigunType: Anime, ActionFormat: DVDRating: PGDescription: Vash the Stampede!*****Movie*****Title: IshtarType: ComedyFormat: VHSRating: PGDescription: Viewable boredom
以上がPythonでのXML解析の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。