- PR -

XmldbでLike検索

1
投稿者投稿内容
阿比留
会議室デビュー日: 2003/12/05
投稿数: 2
投稿日時: 2003-12-05 02:39
はじめまして。
阿比留と申します。

SQLは使ったことがあるのですが、XML自体初めてで
Xindiceと格闘しております。
ORDERBYやLIKE検索などが使えるものなのかWEBで調
べているのですが、見つけることが出来ません。

ORDERBYは今のところHTMLに変換するXSLTで並べ
替えています。

Xindiceでは出来ないものなのでしょうか?
詳しい方教えていただけますと幸いです。
なゆ♪
会議室デビュー日: 2003/11/25
投稿数: 9
投稿日時: 2003-12-06 16:33
はじめまして、なゆ♪と申します。

SQLは使ったことがないので目的としているものとは違うかもしれませんが。。。
私もXindiceから検索するプログラムを作っているので
何かの参考にはなるかもしれません。
JAVAで検索する、ということでよろしいのでしょうか?

LIKE検索について調べたところ、キーワード部分一致検索、というような感じですね。
私はこれについては、以下のコードで行っております。
ちなみにこのコードは以下のサンプルを改良したものの一部です。
http://www.atmarkit.co.jp/fxml/tanpatsu/18xindice/xindice06.html

コード:
 /* 検索結果をまとめる要素<result>を作成する */
 javax.xml.parsers.DocumentBuilderFactory docBuilderFactory = 
  javax.xml.parsers.DocumentBuilderFactory.newInstance();
 docBuilderFactory.setNamespaceAware(true); /* 名前空間を有効にする */
 Document resultDocument = docBuilderFactory.newDocumentBuilder().newDocument();

 /* Xindiceから取得したオブジェクトをXercesでimport */
 ((org.apache.xerces.dom.DocumentImpl)resultDocument).setErrorChecking(false);
 Element resultElement = resultDocument.createElement("result");
 resultDocument.appendChild(resultElement); 

 try {
  /* Database実装クラスの登録 */
  String driver = "org.apache.xindice.client.xmldb.DatabaseImpl";
  Class c = Class.forName(driver);
  Database database = (Database) c.newInstance();
  DatabaseManager.registerDatabase(database);

  /* コレクションの取得 */
  col = DatabaseManager.getCollection("xmldb:xindice:///db/sampledb");

  /* XPathQueryServiceの取得 */
  XPathQueryService service = (XPathQueryService)col.getService("XPathQueryService", "1.0");

  /* とりあえず格納されているもの全部取り出す */
  String xpath = "/";
  ResourceSet resultSet = service.query(xpath);

  /* ResourceSetから検索結果を取り出す */
  ResourceIterator results = resultSet.getIterator();

  while (results.hasMoreResources()) {
   Resource res = results.nextResource();
   if (res.getResourceType().equals("XMLResource")) {
    XMLResource xmlres = (XMLResource)res;
    Node node = xmlres.getContentAsDOM();
    /* 検索した結果から指定されたクエリーで検索 */
    String query = "//*[text()[contains(.,"○○○")]]";
    Node txt = org.apache.xpath.XPathAPI.selectSingleNode(node, query);
    /* クエリーに適合したら結果として追加 */
    if(txt != null){
     /* 結果を子ノードとして追加 */
     resultElement.appendChild(resultDocument.importNode(node.getFirstChild(), true));
    }
   }
  }
 }
 catch (XMLDBException e) {
  throw new ServletException(e);
 }
 finally {
  if (col != null) {
   /* コレクションのクローズ */
   col.close();
  }
 }



ちょっと強引なやり方っぽいのでもっといい方法があるかも
まぁ何かの参考になれば幸いです。

ここでLIKE検索に当たるのは、
 String query = "//*[text()[contains(.,"○○○")]]";
 Node txt = org.apache.xpath.XPathAPI.selectSingleNode(node, query);
の部分です。
Nodeに対してXPathで検索をかけています。
この方法により、Xindiceに格納されているデータから、
テキストノードに○○○が含まれているデータを抽出できます。
このメソッドについては、以下にAPIがあります。
 http://xml.apache.org/xalan-j/apidocs/index.html
他にもNodeListを抽出するAPIもあるので、XPathを工夫すればいろいろできそうです。

ORDERBYについては・・・ちょっとわからないです
阿比留
会議室デビュー日: 2003/12/05
投稿数: 2
投稿日時: 2003-12-08 02:53
なゆ♪さんはじめまして。
ご解答ありがとうございます。

>JAVAで検索する、ということでよろしいのでしょうか?
>LIKE検索について調べたところ、キーワード部分一致検索、というような感じですね。

そうです。JAVAで検索です。
LIKE検索という表現はSQLだけでしたね。
申し訳ないです。

>ここでLIKE検索に当たるのは、
> String query = "//*[text()[contains(.,"○○○")]]";
> Node txt = org.apache.xpath.XPathAPI.selectSingleNode(node, query);
>の部分です。
>Nodeに対してXPathで検索をかけています。

containsはxsltの方で使ってみたのですが、検索したい文字を渡すと
文字化けしてしまって上手く行っていませんでした。
まずはXpathですね。調べてみようと思います。


だいぶ混乱していたのですが先が見えてきて大変助かりました。
取り急ぎお礼まで。
なゆ♪
会議室デビュー日: 2003/11/25
投稿数: 9
投稿日時: 2003-12-10 02:10
阿比留さん、お役に立てたようでなによりです。
私もまだまだ勉強中の身なので、お互い頑張りましょう(o^-')b
1

スキルアップ/キャリアアップ(JOB@IT)