[PR]今日のニュースは
「Infoseek モバイル」


PyXMLのDOMモジュール

 DOM(Document Object Model)とは、 XML文書の要素をオブジェクトとみなし、 それらの親子関係によって文書全体をツリーのようにとらえる考え方で、 SAXと並んでXML文書の解析に広く使われるAPIとして普及しています。 DOMは特に、XMLを要素ノードを追加したり変更したりという、 文書の更新を伴う処理で使われます。 PyXMLのDOMモジュールはJavaのJAXPなど他の言語のAPIと似通った部分が多く、 これらに慣れているととても分かりやすいと思います。

 PyXMLにはいくつかのXMLパーサが用意されているので、 それらのうちの2つを使って、XML文書からDOMツリーを構築し、 単にそれを標準出力に書き出すだけの処理をしてみます。 まずSaxです。

from xml.dom.ext import Print
from xml.dom.ext.reader.Sax import FromXmlFile

doc = FromXmlFile("orders2.xml")
Print(doc)

 おおっと、Python処理系のデフォルト設定ではこのPrintが文字化けしてしまうので、 $PYTHON_HOME/lib/site.py というファイルをテキストエディタで編集して、 デフォルトのエンコーディングを日本語の文字コードにしておきます。

#encoding = "ascii" # Default value set by _PyUnicode_Init()
encoding = "japanese.shift_jis"

 今度はPyExpat(Expat)を使ってみます。

from xml.dom.ext import Print
from xml.dom.ext.reader import PyExpat

reader = PyExpat.Reader()
doc = reader.fromUri("orders2.xml")
Print(doc)
reader.releaseNode(doc)
# end.

 次に、実際にルートノードから順番にDOMツリーを探検していく処理を書いてみます。

from xml.dom.ext import Print
from xml.dom.ext.reader.Sax import FromXmlFile

def checkNode(node):
  type = str(node.nodeType)
  name = node.nodeName
  if name == None: name = ""
  value = node.nodeValue
  if value == None: value = ""

  children = node.childNodes
  attrs = node.attributes
  print "[" + name + "(" + type + ")] = [" + value + "]"
  if attrs != None and len(attrs) > 0:
    print "(ATTRS)"
    for a in attrs: print "ATTR["  + a.name + "] = [" + a.value + "]"
  for c in children:
    checkNode(c)

doc = FromXmlFile("orders2.xml")
checkNode(doc)

 各ノードはPythonオブジェクトで、 それらはnodeType、 nodeName、nodeValue、childNodes、attributes、及びその他いろいろな属性を持ちます。 nodeTypeは整数で、ノードの種類を表します。 例えば1なら要素ノード、3ならテキスト、といった具合です。 nodeNameは要素ノードの場合は要素の名前ですが、 テキストに対しては "#text" の固定値です。 nodeValueはノード値、 childNodesは子ノードオブジェクトの配列、 attributesは属性オブジェクトの配列です。 attributesの各要素になるところの属性オブジェクトは、 name と value の属性を持ちます。それらの意味するところは説明不要と思います。

セクションのサブメニューに戻る
(first uploaded 2003/02/01 last updated 2003/02/01)