libxml2 の Python バインディングを使っているという環境での namespace に関するメモを残す.


XPath を用いて XML 情報を取得するときには,document.xpathNewContext() で生成される context オブジェクトに,XPath 中で用いる namespace を登録しておく必要がある.

<is:insilico-model xmlns:is="http://www.physiome.jp/ns/insilicoml">
<is:header>...</is:header>
</is:insilico-model>

の場合であれば,

context.xpathRegisterNs('is', 'http://www.physiome.jp/ns/insilicoml')

とする.
こうしておくことで,XPath を

/is:insilico-model/is:header/string()

というように使う事ができる.

prefix を省略してデフォルト namespace を設定することができる.XMLは

<insilico-model xmlns="http://www.physiome.jp/ns/insilicoml">
<header>...</header>
</insilico-model>

のように書かれる.
各タグに namespace の prefix が付いていないが,namespace は設定されている.

このときの XPath には少々注意が必要だ.
この場合だと,適当な namespace prefix を用いて

context.xpathRegisterNs('isml', 'http://www.physiome.jp/ns/insilicoml')

というように namespace を context に登録して

/isml:insilico-model/isml:header/string()

という XPath を書く必要がある.

以下はNGである.つまり,空の prefix を用いて

context.xpathRegisterNs('', 'http://www.physiome.jp/ns/insilicoml')

というように namespace を登録して

/insilico-model/header/string()

と書くことはできない

ただし,もし XML にデフォルト namespace が設定されていなければ
(つまり,xmlns="..." が書かれていなければ)
この /insilico-model/header/string() という XPath を使う事ができる.



やじるし libxml2 + Python メモの目次



以下に,簡単にだが namespace の紹介を書いておく.
XML には namespace (名前空間)というのがあって,タグを識別するのに使われる.

例えば,

<is:insilico-model xmlns:is="http://www.physiome.jp/ns/insilicoml">
<is:header>...</is:header>
</is:insilico-model>

の xmlns のところで,is という namespace を定義している.
= に続く URI を用いて一意に is という namespace を定義することになる.
この is は namespace prefix と呼ばれる.

例えば,

<isml:insilico-model xmlns:isml="http://www.physiome.jp/ns/insilicoml">
<isml:header>...</isml:header>
</isml:insilico-model>

となっていたとすれば,URI が上記例と同一なので is と isml は同一の namespace を定義していることになる.

したがって,上記例の XML を,普通はしないが,以下のように書いたとしても問題ない.

<is:insilico-model xmlns:isml="http://www.physiome.jp/ns/insilicoml" xmlns:is="http://www.physiome.jp/ns/insilicoml">
<isml:header>...</is:header>
</isml:insilico-model>

逆に,

<isml:insilico-model xmlns:isml="http://www.physiome.jp/ns/insilicoml">



<isml:insilico-model xmlns:isml="http://www.dokosoko.com/isml">

は異なるタグとして認識される.