XMLDB.jp

XMLDB開発支援
HOME  >  XMLDB開発支援  >  作って学ぶXMLデータベースNeoCore XMS実践 第5回

作って学ぶXMLデータベースNeoCore XMS実践 第5回

2006年12月25日 更新
第5回:検索式を組み込んでシステムを完成させる(後編)
著者:ウルシステムズ  小松 要   2006/4/14



提案書検索機能処理の概要

今回は提案書の検索や提案書のダウンロードを行う提案書検索機能の処理概要と実装方法について説明し、営業支援システムの構築を完成させていきます。

提案書検索機能は、提案書一覧表示機能部と提案書ダウンロード機能部の2つに分けられます。それぞれに必要な処理は以下のようになります。


提案書一覧表示機能

提案書検索機能では、以下の処理が必要となります。

XQueryによる検索処理

指定されたキーワードを含むような提案書を見つける処理です。検索にはXQueryを使用します。使用するXQueryは次のようになります。


for $data in /ND sortby (integer(.//DocID/text())) let $title := $data//frame[@name='提案タイトル']//text() ,$docId := $data//DocID/text() where contains($data//text(),'キーワード') return <result> <title>{string($title)}</title> <docId>{string($docId)}</docId> </result>

▲使用するXQuery

XSLスタイルシートを使用した画面表示処理

画面表示のスタイルを設定するためにXSLスタイルシートを設定します。


提案書ダウンロード機能

提案書ダウンロード機能では、以下の処理が必要となります。

XPathによる検索処理

ドキュメントIDを指定する単純な検索処理のため、XPathを使用します。ドキュメントIDは一覧表示したドキュメント情報から取得されます。指定された提案書を構成するXMLファイルであるcontent.xmlをストア時のXML構造のまま取得します。使用するXPathは次のようになります。

/ND/document-content[../MetaData/DocID='ドキュメントID']

▲使用するXPath

機密情報スタイルが定義された要素のテキスト変換処理

XPathによる検索結果を元にDOMツリーを生成し、機密情報スタイルが適用された要素のテキストをすべて"■"に変換する処理を行います。


提案書を作成して返す処理

機密情報スタイルが定義された要素のテキスト変換処理結果を元にcontent.xmlを作成して、提案書を構成するファイルすべてに対してzip圧縮を行い、ユーザに返却するものです。

提案書検索機能-Javaによる実装

これらの処理をJavaにより実装するために図8のような構成にします。

提案書検索機能構成

▲図8:提案書検索機能構成(画像をクリックすると別ウィンドウに拡大図を表示します)

また主要なクラスとしては次のようなものがあります。

ProposalListLogicクラス
  • 提案書一覧表示機能を実現するクラスで、指定されたキーワードによりXQuery式を作成し検索処理を実行します。
ProposalDownLogicクラス
  • 提案書ダウンロード機能を実現するクラスで、XPath式を作成し検索処理を実行します。
  • その検索結果から、機密情報スタイルが定義された要素のテキスト変換を行い、提案書を構成するその他のファイルと一緒にzip圧縮を行います。

▲表1:主要なクラス

ProposalListLogicクラスとProposalDownLogicクラスのサンプルを以下に示します。赤文字部分が、実際に検索を実行する処理になります。


package jp.co.ulsystems.xmldb.logic;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.neocore.httpclient.SessionManagedNeoConnection;

public class ProposalSearchLogic {
public static final String BEANNAME = "logic";
private String condition = "";
private String queryResultsXml = "";

public ProposalSearchLogic(HttpServletRequest request,HttpServletResponse response) throws Exception {
queryResultsXml = null;
condition = (String)request.getParameter("keyword");
}

public void execute(){
// XQueryの作成
String query = "for $data in /ND sortby (integer(.//DocID/text()))"
+ " let $title := $data//frame[@name='提案タイトル']//text()"
+ " ,$docId := $data//DocID/text()"
+ " where contains($data//text(),'"
+ condition
+ "')"
+ " return"
+ ""
+ ""
+ "{string($docId)}"
+ "";
try{
// XQueryを使用し検索を実行する
// XML DBとのセッションを確立
SessionManagedNeoConnection session =
new SessionManagedNeoConnection("localhost",7701);
session.login("Administrator","admin");
// 検索の実行
queryResultsXml = session.queryXML(query);
// XML DBからログアウト
session.logout ();
} catch (Exception e) {
e.printStackTrace();
}
}

public String getQueryResultsXml() {
return queryResultsXml;
}
}



▲ProposalListLogic.javaクラスのサンプル


※注: サンプルのため、一部省略しています。




package jp.co.ulsystems.xmldb.logic;

import javax.servlet.http.HttpServletRequest;
import org.w3c.dom.Document;
import jp.co.ulsystems.xmldb.ContentChange;
import jp.co.ulsystems.xmldb.ZipCompress;

import com.neocore.httpclient.SessionManagedNeoConnection;

public class ProposalDownLogic {
public static final String BEANNAME = "logic";
private String queryResultsXml = "";
private String docId = "";

public ProposalDownLogic(HttpServletRequest request) throws Exception {
docId = request.getParameter("DocID");
}

/**
* XPathによる検索を実行
**/
public void execute() {
String query = "/ND/document-content[../MetaData/DocID=";
try {
// XPathの条件構築
if (!docId.equals("")) {
query += "'" + docId + "']";
}
// XPathを使用し検索を実行する
// XML DBとのセッションを確立
SessionManagedNeoConnection session =
new SessionManagedNeoConnection("localhost", 7701);
session.login("Administrator", "admin");
// 検索実行
queryResultsXml = session.queryXML(query);
// XML DBからログアウト
session.logout();

// 機密情報スタイルが定義された要素のテキスト変換処理
Document document = contentChange (queryResultsXml);

//提案書を作成する処理
zipCompress (document, docId);

} catch (Exception e) {
e.printStackTrace();
}
}
}


▲ProposalDownLogic.javaクラスのサンプル


※注: サンプルのため、一部省略しています。


提案書検索機能-動作確認

登録した提案書をフリーワードにより検索でき、提案書がダウンロードできることを確認します。あわせてダウンロードされた提案書の機密情報スタイルを適用した項目が表示されないことも確認します。このとき検索条件として、提案書の非定型部分である情報の「実現」という文字を指定して検索します(図9)。

提案書検索機能 動作確認

▲図9:提案書検索機能 動作確認(画像をクリックすると別ウィンドウに拡大図を表示します)

フリーワード検索で登録された提案書が検索できることを確認できたら、さらに見つけた提案書をダウンロードして内容を確認します(図10)。

提案書検索機能 動作確認

▲図10:提案書検索機能 動作確認(画像をクリックすると別ウィンドウに拡大図を表示します)

登録した提案書がダウンロードでき、かつ機密情報スタイルが適用された「お客様名」「提案日」「担当営業者」項目の情報が表示されていないことが確認できました。

これで、XML DBを使用して半定型の提案書を扱う営業支援システムが完成となります。


まとめ

本連載では「XML DBを活用するのに適した場面には何があって、実際のシステム開発イメージがどのようになるのか」という現場のエンジニアの疑問に答えるために、XML DBを使ったシステムを構築してきました。

そのためXML DBの活用に適したシステムとして半定型文書の処理を行うシステムを取り上げ、具体的に半定型文書である提案書を扱う営業支援システムを想定して利用方法などに基づいてXMDBを用いたサンプルプログラムを作成しました。

まとめとして、次のページでこれまで述べてきたことからXML DBを使用するシステム構築で押さえるべき点やRDBを使用したシステム構築との違いについて整理しておきます。

システム全体の構成や開発の進め方はRDBのシステムと変わらない

今回、企業システムの構成として広く使われている3層レイヤの構成を採用し、開発の手順を要件の定義から設計、実装へと進めてきました。このようにシステム構成や開発の進め方は、RDBを使用するシステムと大きな違いはありません。

XML DBを採用することが決まっても、システム構成や開発の進め方については今までの知識や経験を十分に活用することができ、RDBとの違いを意識する必要はありません。

データベース問い合わせ言語としてSQLでなくXQueryを使う

実装の際の最も大きな違いは、RDBでの検索がSQL文で行われるのに対してXML DBへの操作はXQueryで行われるという点です。XQueryはXML DBを扱うエンジニアの必須のスキルになります。

複雑な検索や効率的な検索を行うためには、XQueryについて高いスキルが必要になりますが、これはRDBの場合でも高度な利用の際にSQLについて高いスキルが必要となるのと同様です。

スキーマの設計は不要だがXMLデータ構造の設計は必要

NeoCoreXMS のようにスキーマ設計が不要なタイプのXML DBは、任意の構造のXMLデータを格納することができます(スキーマ設計の必要なXML DBもあります)。これによってシステム設計のための作業が楽になり、スキーマ変更も容易なので仕様変更に強いというメリットがあります。

もちろんシステムで自動処理可能とするので、XMLデータの定型部を設計する必要はあります。しかしRDBのスキーマ定義に比べるとずっとおおまかな定義で済ませることができます。

関連するXML標準についての知識が必要

XML データ構造の設計の際に重要になるのは、すでに規定されているXML標準についての知識が必要になることです。今回提案書作成ツールとして使用した OpenOffice.orgのImpressでは、XMLベースのオフィス文書フォーマットの国際基準である ODF(OpenOfficeFormat)を採用しています。

もちろんこの他にも数多くのXML標準が定められており、それらへの対応についても重要です。例えば財務会計であればXBRL、旅行業であればTravelXMLなどがあります。

今回作成したような非定型業務を支援するシステムは、RDBを中心とする定型業務支援に比べて、あまり手が付けられてこなかった領域です。読者の中には、このような非定型業務を扱うシステムを構築する場面に遭遇し、データをRDBに格納するために苦労しながらスキーマ定義をしてなんとかシステム化を行ってきた経験がある方もいらっしゃるかもしれません。

そのような経験を積まれてきた方にとって、スキーマ定義が不要という性格を持ったXML DBを使ってRDBを使用したシステムでは絶対に必要なスキーマ定義をする必要なく、データの登録が簡単にできるというのはいい体験になるでしょう。逆にこれまでこうした非定型業務支援のシステムに縁がなく、今回のサンプルも無理な想定をした事例のように思えて、現実にどれほど必要性があるのかよくわからないという方もいらっしゃると思います。

そこで次回は想定事例ではなく、実際に非定型業務のシステム化にXML DBを適用した事例を紹介しながらその疑問に答えたいと思います。

▲このページのTOPへ

  • 無償で使える!XMLDB「NeoCore」
  • サイバーテック求人情報
  • メールマガジン申し込み
  • TEchScore

  • ▲NeoCoreについて記載されています!

  • ▲XMLマスター教則本です。試験対策はこれでばっちり!
Copyright (c) CyberTech corporation ltd. All ights Reserved. | サイバーテックについて | ご利用ガイド