XML/ネイティブXMLデータベース ~Xindice~(技術論文2002)
をテンプレートにして作成
Search in
this wiki
and
or
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
*ネイティブXMLデータベース ~Xindice~
RIGHT:2002.10.29
RIGHT:Jomora
#contents
#br
** はじめに
さまざまな方面でXMLが利用されるようになり、その広まりと...
一般に、「XMLに対応したデータベース」というと、「XML文...
本文では、ネイティブXMLデータベースと、現在のリレーショ...
** リレーショナルか、それともXMLネイティブか
今後、ビジネスでやりとりされる文書は、ますますXML化され...
現在のところ、「XML対応のデータベース」製品は、2種類に...
+リレーショナル形式にマッピングして保存するデータベース
+XML文書をそのまま保存できるデータベース
どちらも一長一短がある、というのが現状です。DB選択の際...
** XML対応のリレーショナルデータベース
#ref(relational.gif,right,around);
XML対応のリレーショナルデータベースは、XML文書をリレー...
この方式の特徴は、まさにこの「XML要素を抜き出して保存す...
-保存後は通常のDBデータとして扱えるため、高速なトランザク...
-マッピングの方法は製品によってまちまちである。
-XML文書から要素が抜き取られて保存されることになるため、...
-XML文書には、漢字コードや名前空間の情報などが付加されて...
-そのため、リレーショナルデータベースに格納された情報から...
-完全にオリジナルなXML文書を復元するためには、相当量のデ...
とはいえ、定型のXML文書を扱うだけならば、実績、信頼性、デ...
** ネイティブXMLデータベース
#ref(native.gif,right,around);
XMLの階層構造や、名前空間等の付加情報が複雑な場合には、...
ネイティブXMLデータベースは、XML文書をそのまま、もしく...
この方式の特徴は、XML文書の特徴を生かした管理ができるこ...
-XML文書が持つタグの情報を元にした検索や追加、削除、更新...
-検索結果としてXML文書の任意の一部だけを取得できたり、XML...
-自由に任意の構造を持つXML文書を保存し、データベースに追...
しかし、デメリットもあります。
-業界標準的な問い合わせ言語が確立されていない。
-XMLデータベース製品ごとに問い合わせの方法が異なり、互換...
-大手のRDBMSに比べて、データベースとしての機能、実績、信...
これらの特徴を踏まえた上で、実際にネイティブXMLデータベ...
** Xindice
Xindice(イタリア語風で『ジンディーチェ(zeen-dee-chay...
+Well-Formedドキュメントを格納可能~
スキーマを定義することなくXML文書を格納することができま...
+問い合わせ言語はXPath~
問い合わせには、現在ネイティブXMLデータベースで標準的に...
+更新言語はXML:DB XUpdate~
XMLデータベースの更新に関する標準的な仕様はないのですが...
+エレメントや属性にインデックスを付けることが可能~
問い合わせを高速化できるようインデックスを付けることが...
+セキュリティ関連の機能はない~
現在のバージョンでは、ユーザー認証等の機能がありません...
+すべてJavaで記述されている~
J2SEが動作する環境であれば、動作可能です。ただし、特定...
+Java用のAPIが用意されている~
Javaプログラムからアクセスするための、Javaのクラスライ...
ということがあります。まずは、簡単に使って見ましょう。
** インストール
それでは、Windows上でXindiceのインストールをします。 X...
JDKの環境設定(JAVA_HOME, PATH)
> JAVA_HOME=C:\jdk1.3.1_06
> PATH=%PATH%;%JAVA_HOME%\bin
[[XindiceのWebページ:http://xml.apache.org/xindice/]]か...
Xindiceの環境設定(XINDICE_HOME, PATH)
> XINDICE_HOME=C:\xml-xindice-1.0
> PATH=%PATH%;%XINDICE_HOME%\bin
以上で、インストールは完了です。
** 起動と停止
Xindiceの起動
> %XINDICE_HOME%startup.bat
正常に起動した際には、次のようなメッセージが出力されま...
C:\xml-xindice-1.0>startup.bat
java -classpath … -noverify org.apache.xindice.core.serv...
Xindice 1.0 (Birthday)
Database: 'db' initializing
Script: 'GET' added to script storage
Service: 'db' started
Service: 'HTTPServer' started @ http://hostname:4080/
Service: 'APIService' started
Server Running
Xindiceの終了
> xindiceadmin shutdown -c /db
** コマンドラインからの操作
まずはコマンドラインからデータベースを操作してみましょ...
&ref(sample01.xml);
<?xml version="1.0" encoding="Shift_JIS" ?>
<diary year="2002" month="09">
<date day="08">
<item>一日中、部屋と押入れの整頓に費やす。
9月中に<a href="http://www.bidders.co.jp/bpu/1310605"...
MDプレイヤーとか、もう要らないよなぁ…。</item>
</date>
</diary>
&ref(sample02.xml);
<?xml version="1.0" encoding="Shift_JIS" ?>
<diary year="2002" month="08">
<date day="14">
<item>今日は朝から、帰省移動。
4時間ぐらいかかるんですよ、電車で…。
途中、乗り換えもあって、ずっと寝ていられないし…。</item>
</date>
<date day="15">
<item>今日は、有給充当日。
「自主的に有給とってね」の日です。
なんか、納得いかないんですけど… (^^;;</item>
<item><a href="http://www.town.fukumitsu.toyama.j...
イベント・施設情報が検索できたり、町民の意見交換用の掲示...
なかなかよろしいんじゃないでしょうか?
<a href="http://www.e-fuku3.com/">ユビキタウンふくみ...
でも、Java使ってるらしく、ページ遷移が遅いなぁ、と思うの...
</date>
</diary>
Xindiceでは、XML文書を「コレクション」と「ドキュメント...
まず、db に新規のコレクションを作成します。名前をsample...
コレクションの追加
> xindiceadmin ac -c /db -n sampledb
Created : /db/sampledb
このコレクションに、先ほどの2つのXML文書を、それぞれsam...
ドキュメントの追加
> xindiceadmin ad -c /db/sampledb -f sample01.xml -n sam01
Added document /db/sampledb/sam01
> xindiceadmin ad -c /db/sampledb -f sample02.xml -n sam02
Added document /db/sampledb/sam02
では、これらのドキュメントを検索してみましょう。検索条...
検索
> xindiceadmin xpath -c /db/sampledb -q "//item"
<?xml version="1.0"?>
<item xmlns:src="http://xml.apache.org/xindice/Query" sr...
一日中、部屋と押入れの整頓に費やす。
9月中に<a href="http://www.bidders.co.jp/bpu/1310605">オ...
MDプレイヤーとか、もう要らないよなぁ…。</item>
<?xml version="1.0"?>
<item xmlns:src="http://xml.apache.org/xindice/Query" sr...
4時間ぐらいかかるんですよ、電車で…。
途中、乗り換えもあって、ずっと寝ていられないし…。</item>
<?xml version="1.0"?>
<item xmlns:src="http://xml.apache.org/xindice/Query" sr...
「自主的に有給とってね」の日です。
なんか、納得いかないんですけど… (^^;;</item>
<?xml version="1.0"?>
<item xmlns:src="http://xml.apache.org/xindice/Query" sr...
<a href="http://www.town.fukumitsu.toyama.jp/">私の田舎...
イベント・施設情報が検索できたり、町民の意見交換用の掲示...
なかなかよろしいんじゃないでしょうか?
<a href="http://www.e-fuku3.com/">ユビキタウンふくみつ</...
でも、Java使ってるらしく、ページ遷移が遅いなぁ、と思うの...
検索結果が1件ずつ、XMLドキュメントの形で戻ってきます。
&color(red){[補足] 私の環境では、"//date[@day='08']" のよ...
その他の主なコマンドは下記の通りです。
コレクションのリスト表示
xindice lc -c {ベースとなるコレクション}
コレクションの削除
xindiceadmin dc -c {ベースとなるコレクション} -n {削除す...
ドキュメントのリスト表示
xindice ld -c {ベースとなるコレクション}
ドキュメントの取得
xindice rd -c {ベースとなるコレクション} -n {ドキュメン...
ドキュメントの削除
xindice dd -c {ベースとなるコレクション} -n {ドキュメン...
ちなみに、DBからドキュメントを取得するとわかるのですが...
** Javaプログラムからの利用(検索処理)
Xindiceの検索用APIは、JDBCドライバのような形で提供され...
XPath検索に使うプログラムのサンプルを下記に示し、解説し...
検索サンプルプログラム
01. try {
02. String driver = "org.apache.xindice.client.xmldb...
03. Class c = Class.forName(driver);
04.
05. org.xmldb.api.base.Database database =
06. (org.xmldb.api.base.Database)c.newInstance();
07. org.xmldb.api.DatabaseManager.registerDatabase(d...
08.
09. org.xmldb.api.base.Collection col =
10. org.xmldb.api.DatabaseManager.getCollection
11. ("xmldb:xindice://localhost:4080/db/samp...
12.
13. org.xmldb.api.modules.XPathQueryService service =
14. (org.xmldb.api.modules.XPathQueryService)
15. col.getService("XPathQueryService", "1.0...
16.
17. String xpath = "//date[@day='14']/item";
18. org.xmldb.api.base.ResourceSet resultSet = servi...
19.
20. // イテレータの取得
21. org.xmldb.api.base.ResourceIterator results = re...
22. // リソースがある間、繰り返す
23. while (results.hasMoreResources()) {
24. // 次のリソースを取得
25. org.xmldb.api.base.Resource res = results.ne...
26. // ResourceがXMLResourceかどうかの確認
27. if (res.getResourceType().equals("XMLResourc...
28. // 内容を文字列として表示
29. System.out.println((String)res.getConten...
30. // DOMとして内容を取得
31. org.xmldb.api.modules.XMLResource xmlres...
32. (org.xmldb.api.modules.XMLResource)r...
33. org.w3c.dom.Document document =
34. (org.w3c.dom.Document)xmlres.getCont...
35. // documentに対する処理を行う
36. document = (org.w3c.dom.Document)clean(d...
37. NodeList nl = document.getFirstChild().g...
38. for (int i = 0; i < nl.getLength(); i++) {
39. System.out.println("item[" + i + "] ...
40. + nl.item(i).getFirstChild().get...
41. }
42. } else {
43. System.out.println("not XMLResource");
44. }
45. }
46. } catch (XMLDBException ex) {
47. ex.printStackTrace();
48. } catch (InstantiationException ex) {
49. ex.printStackTrace();
50. } catch (IllegalAccessException ex) {
51. ex.printStackTrace();
52. } catch (ClassNotFoundException ex) {
53. ex.printStackTrace();
54. } finally {
55. if (col != null) {
56. col.close();
57. }
58. }
02~07行目:~
Databaseインターフェイスの実装クラスを、DatabaseManager...
09~11行目:~
コレクションを取得します。ここで使うURIは、"xmldb:xindi...
13~15行目:~
コレクションに対して行いたいことに応じて、対応するサー...
17~18行目:~
サービスのquery()メソッドにXPathクエリを渡して、Resourc...
20~21行目:~
ResourceSetには検索結果の集合が格納されています。1つ1つ...
22~45行目:~
Resourceには種類があり、現在のorg.xml.api.moduleパッケ...
なお、36行目で使っているcleanメソッドは、空のテキストノ...
public static Node clean(Node node) {
if (node.hasChildNodes()) {
Node childnode = node.getFirstChild();
while (childnode != null) {
if (childnode.getNodeType() == Node.TEXT_...
&& childnode.getNodeValue().trim().le...
Node delnode = childnode;
childnode = childnode.getNextSibling();
node.removeChild(delnode);
} else {
if (childnode.hasChildNodes()) {
clean(childnode);
}
childnode = childnode.getNextSibling();
}
}
}
return node;
}
56行目:~
処理が終了したら、コレクションをクローズして解放します。
以上で、基本的な参照方法の説明は終わりですが、%XINDICE_...
** XUpdate
次に、XMLデータの追加・更新・削除を行います。Xindiceで...
ちなみに、[[XUpdate:http://www.xmldb.org/xupdate/]]のペ...
** XMLデータの追加
XMLデータの追加プログラムのサンプルを示し、解説していき...
例えば、day属性が「08」であるdateノードの子ノードに、it...
XMLデータ追加サンプルプログラム
01. try {
02. String driver = "org.apache.xindice.client.xm...
03. Class c = Class.forName(driver);
04.
05. org.xmldb.api.base.Database database =
06. (org.xmldb.api.base.Database)c.newInstanc...
07. org.xmldb.api.DatabaseManager.registerDatabas...
08.
09. col = org.xmldb.api.DatabaseManager.getCollec...
10. ("xmldb:xindice://localhost:4080/db/sampl...
11.
12. // XUpdateQueryServiceの取得
13. org.xmldb.api.modules.XUpdateQueryService ser...
14. (org.xmldb.api.modules.XUpdateQueryService)
15. col.getService("XUpdateQueryService",...
16.
17. String xupdate;
18. xupdate = "<xupdate:modifications version=\"1...
19. + "xmlns:xupdate=\"http://www.xmldb.o...
20. + "<xupdate:append "
21. + "select=\"/diary/date[@day='08']\" ...
22. + "<item sam=\"test\">sample</item>"
23. + "</xupdate:append>"
24. + "</xupdate:modifications>";
25. long num = service.update(xupdate);
26. } catch (InstantiationException ex) {
27. ex.printStackTrace();
28. } catch (IllegalAccessException ex) {
29. ex.printStackTrace();
30. } catch (ClassNotFoundException ex) {
31. ex.printStackTrace();
32. } catch (XMLDBException ex) {
33. ex.printStackTrace();
34. } finally {
35. if (col != null) {
36. col.close();
37. }
38. }
02~10行目:~
参照の際と同じです。Databaseの実装クラスを登録し、コレ...
12~15行目:~
XUpdateQueryServiceを取得します。
17~23行目:~
XUpdate言語の構文です。xupdate:appendノードのselect属性...
child属性で追加する場所を指定しています。指定が無い場合...
24行目:~
サービスのupdate()メソッドにXUpdate構文を渡しています。...
&color(red){ 実は、追加・挿入するXMLデータの要素、属性に...
org.omg.CORBA.DATA_CONVERSION: minor code: 1398079494 co...
&color(red){というエラーが表示されて追加できません。いろ...
XMLデータの追加の方法は、他にもあります。以下に紹介しま...
** XMLデータの追加(2)
下記の xupdate:insert-after を使ったXUpdate構文でも、上...
xupdate:insert-after
<xupdate:modifications version="1.0" xmlns:xupdate="http...
<xupdate:insert-after select="/diary/date[@day='08']/i...
<item sam="test">sample</item>
</xupdate:insert-after>
</xupdate:modifications>
** XMLデータの追加(3)
xupdate:insert-before の動作も、名前から推して知るべし...
xupdate:insert-before
<xupdate:modifications version="1.0" xmlns:xupdate="http...
<xupdate:insert-before select="/diary/date[@day='08']/...
<item sam="sample">test</item>
</xupdate:insert-before>
</xupdate:modifications>
** XMLデータの更新
xupdate:update は、文字列の更新をします。「ノードセット...
xupdate:update
<xupdate:modifications version="1.0" xmlns:xupdate="http...
<xupdate:update select="/diary/date[@day='08']/item[la...
sample1
</xupdate:update>
</xupdate:modifications>
** XMLデータの削除
xupdate:remove は、ノードの削除をします。
xupdate:remove
<xupdate:modifications version="1.0" xmlns:xupdate="http...
<xupdate:update select="/diary/date[@day='08']/item[la...
</xupdate:modifications>
** その他のインストラクション
xupdate:rename は、ノード名を変更します。
xupdate:variable は、変数を定義できます。
xupdate:value-of は、他のノードを参照できます。
xupdate:if は、条件の指定ができます。
これらは、XUpdate仕様に記述されていますが、Xindice1.0の...
** インデックスの指定
リレーショナルデータベースでも必ずといっていいほど利用...
インデックスのリスト表示
xindiceadmin li -c {コレクション}
インデックスの追加
xindiceadmin ai -c {コレクション} -n {インデックス名} -p...
パターンはXPath指定です。
インデックスの削除
xindiceadmin di -c {コレクション} -n {インデックス名}
インデックスをつけると、ドキュメント数の増加に伴う参照...
Xindice1.0の実装では、内容に日本語が入るものに対してイ...
** Xindiceについての補足
プログラムからColectionの管理を行うには、CollelctionManag...
** おわりに
今回の調査で目に付いたのは、Xindiceの日本語対応の不備で...
そういう点では、[[株式会社メディアフュージョン:http://w...
今後も各方面でのXMLの普及に伴い、XMLデータをスムーズに...
終了行:
*ネイティブXMLデータベース ~Xindice~
RIGHT:2002.10.29
RIGHT:Jomora
#contents
#br
** はじめに
さまざまな方面でXMLが利用されるようになり、その広まりと...
一般に、「XMLに対応したデータベース」というと、「XML文...
本文では、ネイティブXMLデータベースと、現在のリレーショ...
** リレーショナルか、それともXMLネイティブか
今後、ビジネスでやりとりされる文書は、ますますXML化され...
現在のところ、「XML対応のデータベース」製品は、2種類に...
+リレーショナル形式にマッピングして保存するデータベース
+XML文書をそのまま保存できるデータベース
どちらも一長一短がある、というのが現状です。DB選択の際...
** XML対応のリレーショナルデータベース
#ref(relational.gif,right,around);
XML対応のリレーショナルデータベースは、XML文書をリレー...
この方式の特徴は、まさにこの「XML要素を抜き出して保存す...
-保存後は通常のDBデータとして扱えるため、高速なトランザク...
-マッピングの方法は製品によってまちまちである。
-XML文書から要素が抜き取られて保存されることになるため、...
-XML文書には、漢字コードや名前空間の情報などが付加されて...
-そのため、リレーショナルデータベースに格納された情報から...
-完全にオリジナルなXML文書を復元するためには、相当量のデ...
とはいえ、定型のXML文書を扱うだけならば、実績、信頼性、デ...
** ネイティブXMLデータベース
#ref(native.gif,right,around);
XMLの階層構造や、名前空間等の付加情報が複雑な場合には、...
ネイティブXMLデータベースは、XML文書をそのまま、もしく...
この方式の特徴は、XML文書の特徴を生かした管理ができるこ...
-XML文書が持つタグの情報を元にした検索や追加、削除、更新...
-検索結果としてXML文書の任意の一部だけを取得できたり、XML...
-自由に任意の構造を持つXML文書を保存し、データベースに追...
しかし、デメリットもあります。
-業界標準的な問い合わせ言語が確立されていない。
-XMLデータベース製品ごとに問い合わせの方法が異なり、互換...
-大手のRDBMSに比べて、データベースとしての機能、実績、信...
これらの特徴を踏まえた上で、実際にネイティブXMLデータベ...
** Xindice
Xindice(イタリア語風で『ジンディーチェ(zeen-dee-chay...
+Well-Formedドキュメントを格納可能~
スキーマを定義することなくXML文書を格納することができま...
+問い合わせ言語はXPath~
問い合わせには、現在ネイティブXMLデータベースで標準的に...
+更新言語はXML:DB XUpdate~
XMLデータベースの更新に関する標準的な仕様はないのですが...
+エレメントや属性にインデックスを付けることが可能~
問い合わせを高速化できるようインデックスを付けることが...
+セキュリティ関連の機能はない~
現在のバージョンでは、ユーザー認証等の機能がありません...
+すべてJavaで記述されている~
J2SEが動作する環境であれば、動作可能です。ただし、特定...
+Java用のAPIが用意されている~
Javaプログラムからアクセスするための、Javaのクラスライ...
ということがあります。まずは、簡単に使って見ましょう。
** インストール
それでは、Windows上でXindiceのインストールをします。 X...
JDKの環境設定(JAVA_HOME, PATH)
> JAVA_HOME=C:\jdk1.3.1_06
> PATH=%PATH%;%JAVA_HOME%\bin
[[XindiceのWebページ:http://xml.apache.org/xindice/]]か...
Xindiceの環境設定(XINDICE_HOME, PATH)
> XINDICE_HOME=C:\xml-xindice-1.0
> PATH=%PATH%;%XINDICE_HOME%\bin
以上で、インストールは完了です。
** 起動と停止
Xindiceの起動
> %XINDICE_HOME%startup.bat
正常に起動した際には、次のようなメッセージが出力されま...
C:\xml-xindice-1.0>startup.bat
java -classpath … -noverify org.apache.xindice.core.serv...
Xindice 1.0 (Birthday)
Database: 'db' initializing
Script: 'GET' added to script storage
Service: 'db' started
Service: 'HTTPServer' started @ http://hostname:4080/
Service: 'APIService' started
Server Running
Xindiceの終了
> xindiceadmin shutdown -c /db
** コマンドラインからの操作
まずはコマンドラインからデータベースを操作してみましょ...
&ref(sample01.xml);
<?xml version="1.0" encoding="Shift_JIS" ?>
<diary year="2002" month="09">
<date day="08">
<item>一日中、部屋と押入れの整頓に費やす。
9月中に<a href="http://www.bidders.co.jp/bpu/1310605"...
MDプレイヤーとか、もう要らないよなぁ…。</item>
</date>
</diary>
&ref(sample02.xml);
<?xml version="1.0" encoding="Shift_JIS" ?>
<diary year="2002" month="08">
<date day="14">
<item>今日は朝から、帰省移動。
4時間ぐらいかかるんですよ、電車で…。
途中、乗り換えもあって、ずっと寝ていられないし…。</item>
</date>
<date day="15">
<item>今日は、有給充当日。
「自主的に有給とってね」の日です。
なんか、納得いかないんですけど… (^^;;</item>
<item><a href="http://www.town.fukumitsu.toyama.j...
イベント・施設情報が検索できたり、町民の意見交換用の掲示...
なかなかよろしいんじゃないでしょうか?
<a href="http://www.e-fuku3.com/">ユビキタウンふくみ...
でも、Java使ってるらしく、ページ遷移が遅いなぁ、と思うの...
</date>
</diary>
Xindiceでは、XML文書を「コレクション」と「ドキュメント...
まず、db に新規のコレクションを作成します。名前をsample...
コレクションの追加
> xindiceadmin ac -c /db -n sampledb
Created : /db/sampledb
このコレクションに、先ほどの2つのXML文書を、それぞれsam...
ドキュメントの追加
> xindiceadmin ad -c /db/sampledb -f sample01.xml -n sam01
Added document /db/sampledb/sam01
> xindiceadmin ad -c /db/sampledb -f sample02.xml -n sam02
Added document /db/sampledb/sam02
では、これらのドキュメントを検索してみましょう。検索条...
検索
> xindiceadmin xpath -c /db/sampledb -q "//item"
<?xml version="1.0"?>
<item xmlns:src="http://xml.apache.org/xindice/Query" sr...
一日中、部屋と押入れの整頓に費やす。
9月中に<a href="http://www.bidders.co.jp/bpu/1310605">オ...
MDプレイヤーとか、もう要らないよなぁ…。</item>
<?xml version="1.0"?>
<item xmlns:src="http://xml.apache.org/xindice/Query" sr...
4時間ぐらいかかるんですよ、電車で…。
途中、乗り換えもあって、ずっと寝ていられないし…。</item>
<?xml version="1.0"?>
<item xmlns:src="http://xml.apache.org/xindice/Query" sr...
「自主的に有給とってね」の日です。
なんか、納得いかないんですけど… (^^;;</item>
<?xml version="1.0"?>
<item xmlns:src="http://xml.apache.org/xindice/Query" sr...
<a href="http://www.town.fukumitsu.toyama.jp/">私の田舎...
イベント・施設情報が検索できたり、町民の意見交換用の掲示...
なかなかよろしいんじゃないでしょうか?
<a href="http://www.e-fuku3.com/">ユビキタウンふくみつ</...
でも、Java使ってるらしく、ページ遷移が遅いなぁ、と思うの...
検索結果が1件ずつ、XMLドキュメントの形で戻ってきます。
&color(red){[補足] 私の環境では、"//date[@day='08']" のよ...
その他の主なコマンドは下記の通りです。
コレクションのリスト表示
xindice lc -c {ベースとなるコレクション}
コレクションの削除
xindiceadmin dc -c {ベースとなるコレクション} -n {削除す...
ドキュメントのリスト表示
xindice ld -c {ベースとなるコレクション}
ドキュメントの取得
xindice rd -c {ベースとなるコレクション} -n {ドキュメン...
ドキュメントの削除
xindice dd -c {ベースとなるコレクション} -n {ドキュメン...
ちなみに、DBからドキュメントを取得するとわかるのですが...
** Javaプログラムからの利用(検索処理)
Xindiceの検索用APIは、JDBCドライバのような形で提供され...
XPath検索に使うプログラムのサンプルを下記に示し、解説し...
検索サンプルプログラム
01. try {
02. String driver = "org.apache.xindice.client.xmldb...
03. Class c = Class.forName(driver);
04.
05. org.xmldb.api.base.Database database =
06. (org.xmldb.api.base.Database)c.newInstance();
07. org.xmldb.api.DatabaseManager.registerDatabase(d...
08.
09. org.xmldb.api.base.Collection col =
10. org.xmldb.api.DatabaseManager.getCollection
11. ("xmldb:xindice://localhost:4080/db/samp...
12.
13. org.xmldb.api.modules.XPathQueryService service =
14. (org.xmldb.api.modules.XPathQueryService)
15. col.getService("XPathQueryService", "1.0...
16.
17. String xpath = "//date[@day='14']/item";
18. org.xmldb.api.base.ResourceSet resultSet = servi...
19.
20. // イテレータの取得
21. org.xmldb.api.base.ResourceIterator results = re...
22. // リソースがある間、繰り返す
23. while (results.hasMoreResources()) {
24. // 次のリソースを取得
25. org.xmldb.api.base.Resource res = results.ne...
26. // ResourceがXMLResourceかどうかの確認
27. if (res.getResourceType().equals("XMLResourc...
28. // 内容を文字列として表示
29. System.out.println((String)res.getConten...
30. // DOMとして内容を取得
31. org.xmldb.api.modules.XMLResource xmlres...
32. (org.xmldb.api.modules.XMLResource)r...
33. org.w3c.dom.Document document =
34. (org.w3c.dom.Document)xmlres.getCont...
35. // documentに対する処理を行う
36. document = (org.w3c.dom.Document)clean(d...
37. NodeList nl = document.getFirstChild().g...
38. for (int i = 0; i < nl.getLength(); i++) {
39. System.out.println("item[" + i + "] ...
40. + nl.item(i).getFirstChild().get...
41. }
42. } else {
43. System.out.println("not XMLResource");
44. }
45. }
46. } catch (XMLDBException ex) {
47. ex.printStackTrace();
48. } catch (InstantiationException ex) {
49. ex.printStackTrace();
50. } catch (IllegalAccessException ex) {
51. ex.printStackTrace();
52. } catch (ClassNotFoundException ex) {
53. ex.printStackTrace();
54. } finally {
55. if (col != null) {
56. col.close();
57. }
58. }
02~07行目:~
Databaseインターフェイスの実装クラスを、DatabaseManager...
09~11行目:~
コレクションを取得します。ここで使うURIは、"xmldb:xindi...
13~15行目:~
コレクションに対して行いたいことに応じて、対応するサー...
17~18行目:~
サービスのquery()メソッドにXPathクエリを渡して、Resourc...
20~21行目:~
ResourceSetには検索結果の集合が格納されています。1つ1つ...
22~45行目:~
Resourceには種類があり、現在のorg.xml.api.moduleパッケ...
なお、36行目で使っているcleanメソッドは、空のテキストノ...
public static Node clean(Node node) {
if (node.hasChildNodes()) {
Node childnode = node.getFirstChild();
while (childnode != null) {
if (childnode.getNodeType() == Node.TEXT_...
&& childnode.getNodeValue().trim().le...
Node delnode = childnode;
childnode = childnode.getNextSibling();
node.removeChild(delnode);
} else {
if (childnode.hasChildNodes()) {
clean(childnode);
}
childnode = childnode.getNextSibling();
}
}
}
return node;
}
56行目:~
処理が終了したら、コレクションをクローズして解放します。
以上で、基本的な参照方法の説明は終わりですが、%XINDICE_...
** XUpdate
次に、XMLデータの追加・更新・削除を行います。Xindiceで...
ちなみに、[[XUpdate:http://www.xmldb.org/xupdate/]]のペ...
** XMLデータの追加
XMLデータの追加プログラムのサンプルを示し、解説していき...
例えば、day属性が「08」であるdateノードの子ノードに、it...
XMLデータ追加サンプルプログラム
01. try {
02. String driver = "org.apache.xindice.client.xm...
03. Class c = Class.forName(driver);
04.
05. org.xmldb.api.base.Database database =
06. (org.xmldb.api.base.Database)c.newInstanc...
07. org.xmldb.api.DatabaseManager.registerDatabas...
08.
09. col = org.xmldb.api.DatabaseManager.getCollec...
10. ("xmldb:xindice://localhost:4080/db/sampl...
11.
12. // XUpdateQueryServiceの取得
13. org.xmldb.api.modules.XUpdateQueryService ser...
14. (org.xmldb.api.modules.XUpdateQueryService)
15. col.getService("XUpdateQueryService",...
16.
17. String xupdate;
18. xupdate = "<xupdate:modifications version=\"1...
19. + "xmlns:xupdate=\"http://www.xmldb.o...
20. + "<xupdate:append "
21. + "select=\"/diary/date[@day='08']\" ...
22. + "<item sam=\"test\">sample</item>"
23. + "</xupdate:append>"
24. + "</xupdate:modifications>";
25. long num = service.update(xupdate);
26. } catch (InstantiationException ex) {
27. ex.printStackTrace();
28. } catch (IllegalAccessException ex) {
29. ex.printStackTrace();
30. } catch (ClassNotFoundException ex) {
31. ex.printStackTrace();
32. } catch (XMLDBException ex) {
33. ex.printStackTrace();
34. } finally {
35. if (col != null) {
36. col.close();
37. }
38. }
02~10行目:~
参照の際と同じです。Databaseの実装クラスを登録し、コレ...
12~15行目:~
XUpdateQueryServiceを取得します。
17~23行目:~
XUpdate言語の構文です。xupdate:appendノードのselect属性...
child属性で追加する場所を指定しています。指定が無い場合...
24行目:~
サービスのupdate()メソッドにXUpdate構文を渡しています。...
&color(red){ 実は、追加・挿入するXMLデータの要素、属性に...
org.omg.CORBA.DATA_CONVERSION: minor code: 1398079494 co...
&color(red){というエラーが表示されて追加できません。いろ...
XMLデータの追加の方法は、他にもあります。以下に紹介しま...
** XMLデータの追加(2)
下記の xupdate:insert-after を使ったXUpdate構文でも、上...
xupdate:insert-after
<xupdate:modifications version="1.0" xmlns:xupdate="http...
<xupdate:insert-after select="/diary/date[@day='08']/i...
<item sam="test">sample</item>
</xupdate:insert-after>
</xupdate:modifications>
** XMLデータの追加(3)
xupdate:insert-before の動作も、名前から推して知るべし...
xupdate:insert-before
<xupdate:modifications version="1.0" xmlns:xupdate="http...
<xupdate:insert-before select="/diary/date[@day='08']/...
<item sam="sample">test</item>
</xupdate:insert-before>
</xupdate:modifications>
** XMLデータの更新
xupdate:update は、文字列の更新をします。「ノードセット...
xupdate:update
<xupdate:modifications version="1.0" xmlns:xupdate="http...
<xupdate:update select="/diary/date[@day='08']/item[la...
sample1
</xupdate:update>
</xupdate:modifications>
** XMLデータの削除
xupdate:remove は、ノードの削除をします。
xupdate:remove
<xupdate:modifications version="1.0" xmlns:xupdate="http...
<xupdate:update select="/diary/date[@day='08']/item[la...
</xupdate:modifications>
** その他のインストラクション
xupdate:rename は、ノード名を変更します。
xupdate:variable は、変数を定義できます。
xupdate:value-of は、他のノードを参照できます。
xupdate:if は、条件の指定ができます。
これらは、XUpdate仕様に記述されていますが、Xindice1.0の...
** インデックスの指定
リレーショナルデータベースでも必ずといっていいほど利用...
インデックスのリスト表示
xindiceadmin li -c {コレクション}
インデックスの追加
xindiceadmin ai -c {コレクション} -n {インデックス名} -p...
パターンはXPath指定です。
インデックスの削除
xindiceadmin di -c {コレクション} -n {インデックス名}
インデックスをつけると、ドキュメント数の増加に伴う参照...
Xindice1.0の実装では、内容に日本語が入るものに対してイ...
** Xindiceについての補足
プログラムからColectionの管理を行うには、CollelctionManag...
** おわりに
今回の調査で目に付いたのは、Xindiceの日本語対応の不備で...
そういう点では、[[株式会社メディアフュージョン:http://w...
今後も各方面でのXMLの普及に伴い、XMLデータをスムーズに...
ページ名: