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">
は異なるタグとして認識される.
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 を使う事ができる.
![やじるし](https://emoji.ameba.jp/img/user/yu/yuka-k-blog/12799.gif)
以下に,簡単にだが 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">
は異なるタグとして認識される.