作者: 機械伯爵
日時: 2003/10/11(00:06)
 え〜このタイトルで「DOMの話題だな」とピンと来たあ
なたは、ヲタです(笑)

※健全な方へ:「機動戦士ガンダム」シリーズ初代に登
  場した、モビルスーツ(いわゆるロボット)の一つに、
  「ドム」というのがいまして、そいつの持ってたデカ
  いバズーカを「ジャイアントバズ」といいます。ちな
  みに私はガンダムマニアではありませんが、ヲタでは
  ファーストガンダムのある程度は常識です(・・・や
  な常識)

 それはとまれ、PyPageをいじってますと、ミニマムフ
レームワークですから、自分でいろいろ拡張しようと
「うずうず」するわけです。

※ここらへん、巨大フレームワークをハッキングするタ
  イプと、最小フレームワークを拡張するタイプに分か
  れると思います。私は後者ですが、前者のタイプの方
  なら、PyPageよりZope向けですね。

 で、やっぱWebサーバの拡張ですから、XML関係のほう
がかっこいい・・・そういった安易な気持ちでXML操作系
モジュールを見回していたのですが、そこで目についた
のがDOMです。

 そもそもDOMについては、「DynamicHTMLから発展した」
という経緯から、なんかMSチックな匂いがして、敬遠し
ていたのですが、調べてみると、HTMLというよりはマー
クアップによるデータベースとして使えそうなので、ち
と調べてみました。

※WWWはそもそもアプリケーションとしての位置付けでは
  データベースの一種なので、「HTMLというよりは〜」
  というのはヘンな言い方ですが、どうしても昨今の華
  やかなコンテンツを見ていると、何か違うモノのよう
  に見えますので、敢えてこういう言い方しました。

 このように、DOMについてもxml.domモジュールについ
ても、例によって「適当に」しか調べてませんが、とり
あえず使ってみることは出来そうなので、興味のある方
はやってみてください。

 なお、正式なxml.domではなく、コンパクトなminidom
モジュールを使用していますので、DOMの正式なAPIでな
い場合もありますのでご承知ください。

<以下、自分用の覚書より抜粋>

■DOMオブジェクト作成
	xml.dom.minidom.parse("filename")
	xml.dom.minidom.parse(fileobject)
	xml.dom.minidom.parseString("XML DOCUMENT")
 XMLファイル名、あるいはopenされたfileオブジェクト、
あるいはダイレクトにXMLをぶちこんで、DOMオブジェク
トを作る。
 ちなみにノードの種類は、ElementノードとTextノード
しかできない(DTDとか書けば他の型を指定できるのかも
しれないが、面倒なので未確認)

■要素の取り出し
	dom_obj.getElementsByTagName("tagname")
	node_obj.getElementsByTagName("tagname")
 DOMオブジェクトおよび各ノードオブジェクトから、
tagnameのタグでかこまれた要素(Element)を全てリスト
で出す。1つでもリストになるので、一つだけなら[0]と
かつけること。以降、ノードオブジェクトでできること
は大体DOMオブジェクトでもできる。

■子ノードの操作
	node.childNodes
 タグに囲まれた部分をリストで出す。ある要素からデー
タ内容を引っ張り出す時に用いるが、これもリストにな
るので[0]とか使う。省略するとテキストデータになるの
で、data要素で読み出す。

■実際の取り出し方・・・

ex)XMLファイルtest.xml
<root>
 <main>
  <sub1>D11</sub1>
  <sub2>D12</sub2>
  <sub3>D13</sub3>
 </main>
 <main>
  <sub1>D21</sub1>
  <sub2>D22</sub2>
  <sub3>D23</sub3>
 </main>
</root>

ex)文字列u"D22"を変数vに取得する

>>> from xml.dom.minidom import parse
>>> dom = parse("test.xml")
>>> node_main = dom.getElementsByTagName("main")[1]
>>> node_sub2 = dom.getElementsByTagName("sub2")[0]
>>> cont = dom.childNodes[0]
>>> v = cont.data
>>> v
u'D22'
>>>

■XMLデータ文字列として出力
	node.toxml([encoding])
	toprettyxml([indent[, newl]])
 toxmlはベタデータ、toprettyxmlは整形されたデータ
を吐き出す。
 こいつをファイルに書き込めば、XMLデータが更新でき
る。

■miniDOMオブジェクトの切断
	unlink()
 minidomオブジェクトを終了する際に必要。循環参照な
どで通常は消えない場合も確実に消去してくれる。

■ノードの追加
	node.appendChild(NewChild)
	node.appendChild(NewChild)
 新しい子ノードを追加。
 NewChildは、他のDOMから導入するか、以下のようにし
て直接記述する。

>>> tempDOM = parseString("<data>666</data>")
>>> nc = tempDOM.getElementsByTagName("data")[0]

■属性値の取り出し
	node.getAttribute("attrName")
 ノードのリストから、属性値(Attribute)を取り出す。
なお、存在しない(記述されていない)属性値を参照する
と、空文字列""が返される。

■属性値の設定
	node.setAttribute("attrName","DATA")
 新たな属性値をつけくわえても、現在ある属性値を変
更するのも可。



 データフォーマットがはっきり決まっているモノに対しては、以上くらいのオブ
ジェクトハンドラが使えれば十分イロイロ使えると思います。

 私もイロイロつかおう・・・

/機械伯爵/