JDOM入門 ~Namespaceを扱う~

1.Namespaceとは?

XML の特徴は,いうまでもなくタグを自由に定義できるという点にある.このことは,独自タグの定義が氾濫してしまうということも意味する.たとえば,< title>というタグは,様々なXMLベースの言語で定義される可能性がある.そこで,異なった複数のXML言語でかかれた文書を統合する場合, 同じ名前をタグが出てくる可能性は避けられない.

そこで,この問題を解決すのがNamespaceである.Java風に言えば,パッケージに類似すると考えればよいだろう.つまり,< title>というタグが何のXML言語で定義された<title>であるのか,宣言し,使い分けるということだ.

2.Namespaceの宣言と利用例

Namespaceの宣言は,XML文書において下記のように記述する.この例は,RSSとDublin Coreのタグを区別できるようにしている.

xmlns="http://purl.org/rss/1.0/"

xmlns:dc="http://purl.org/dc/elements/1.1/"

xmlnsという語は,「XMLNamespace」の略だ.xmlns:に続いて

prefix=定義しているURI

を記述することになる.2行目を説明すると,

「dcというprefixはhttp://purl.org/dc/elements/1.1/で,定義されたものですよ」

という意味になる.1行目も同様だが1行目についてはprefixを宣言していない.(xmlnsの次にすぐイコールが記述されている)

以下は,上記のNamespaceを利用したXML文書の一部である.

<title>おちくんのページ</title>

<dc:date>2004-03-01T03:01:33+0900</dc:date>

ここでいう<title>とは,RSSとして定義されているtitleを意味する.そして,<dc:date>は,Dublin Coreで定義されているdateタグを意味する....というように解釈する.

3.JDOMによるNamespaceの利用

Namespaceが定義してあるXML文書に対して,

root.getChild("title");

のように,単純にエレメントを呼び出したりするとエラーになる.

そこでJDOMでは,org.jdom.NamespaceにNamespaceクラスというのがあり,それを用いてNamespaceを宣言し,各メソッドで呼び出すことになる.

//Namespaceの宣言

Namespace ns = Namespace.getNamespace("http://purl.org/rss/1.0/");

//Namespaceをつかった子エレメントの呼び出し

Element channel=root.getChild("channel",ns);

上記の例では,RSSで定義されているchannelというタグを呼び出している.最初の行で,rssを定義しているURIから,Namespaceを宣 言し,次の行でgetChildメソッドを呼び出す際に,Namespaceもあわせて指定している点に注意していただきたい.

もし,

xmlns:dc="http://purl.org/dc/elements/1.1/"

のようにprefixを宣言しているNamespaceである場合は,

//Namespaceの宣言

Namespace ns = Namespace.getNamespace("dc","http://purl.org/dc/elements/1.1/");

というように,Namespaceを宣言すること.

複数のNameSpaceの宣言

XML文書において,複数のNamespaceを扱う場合がある.そのときは,rootエレメントの属性表記でNamespaceを宣言する必要がある. しかし,setNamespace()メソッドを利用すると1つしか定義できない.その場合は,以下のようにすればよい.

root.setNamespace(nsRSS);

root.addNamespaceDeclaration(nsRDF);