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);