Symfoware

Symfowareについての考察blog

Debian Jetty7の環境でeXistを起動する

以前、TomcatでeXistを動作させました。
Debianに eXist 1.4.0 をサイレントインストールし、Tomcat上で動かす

軽量・高速で評判の高いJettyで動作させてみます。



前提条件



JavaとJettyのインストールを行っておきます。
Javaのインストール
Jettyのインストール

また、eXistをインストールし、warファイルを作成しておきます。
Debianに eXist 1.4.0 をサイレントインストールし、Tomcat上で動かす




eXistのインストール



当初、/usr/local/jetty/webapps/にwarファイルを配置すれば
終わりだろうと思っていたのですが、Jettyの仕様としてwebappsに
配置されたwarファイルを/tmpに展開して利用するようです。

そのため、Jettyを再起動すると、/tmpに展開したモジュールも削除され
せっかく登録したデータが失われてしまいました。

ちゃんとした配備方法がよくわかっていないのですが、とりあえず
warをunzipしてwebappsに配置してやればよさそうなので、この方法で逃げています。

以下、手順です。


### アプリケーション配置用のディレクトリを作成
# mkdir /usr/local/jetty/webapps/exist

### warファイルを作成したディレクトリにコピー
# cp /root/eXist/dist/exist-1.4.0-rev10440.war /usr/local/jetty/webapps/exist/exist.war

### warファイルを解凍
# cd /usr/local/jetty/webapps/exist
# unzip cd exist.war
# rm -f exist.war




jettyを起動して、動作を確認します。

# cd /usr/local/jetty/bin/
# # ./jetty.sh start




これでhttp://[サーバーIP]:8080/exist/にアクセスすれば、
eXistの画面が表示されるはず。





テーマ:データベース - ジャンル:コンピュータ

  1. 2010/01/18(月) 12:11:23|
  2. eXist
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

XMLDB eXist RSSデータをPythonで登録し、マッシュアップ

eXistで検索結果にxslを適用できることがわかったので、
サンプルとして以前DB2+Javaで試した、RSSのマージをやってみることにします。

Javaでrssデータを取得し、DB2のxml列に登録する
Tomcatで動作するサーブレットからコネクションプーリングを使用してDB2に接続する
DB2のXSLTRANSFORMで変換したデータをサーブレットで表示す



rssデータの取得と登録



eXistにrssというコレクションを作成し、そこに取得したrssデータを
登録するプログラムを作成します。

取得元は、以下のURLです。

Yahoo! ブログ検索
http://blog-search.yahoo.co.jp/rss?p=XML&sq=M&ei=UTF-8&so=dd
gooブログ/フィード記事検索
http://blog.search.goo.ne.jp/search_goo/result/?MT=XML&dc=10&st=time&ts=goo&from=blog&da=all&tg=all&rss=2&fs=all&rm=1
Google ブログ検索
http://blogsearch.google.co.jp/blogsearch_feeds?hl=ja&q=XML&lr=lang_ja&ie=utf-8&num=10&output=rss



#!/usr/bin/env python
# -*- coding:utf-8 -*-
import xmlrpclib
import urllib2

#データの取得と登録
def get_data(name, url):
    #指定したurlに接続
    url_data =urllib2.urlopen(url)
    
    #接続するURL
    xmlrpc_url = 'http://admin:@localhost:8080/exist/xmlrpc'
    #xml-rpcサービスを作成
    srv = xmlrpclib.ServerProxy(xmlrpc_url)
    #sampleコレクションにtemplate.xslという名前で保存
    srv.parse(url_data.read(), "/rss/%s.xml" % (name) , 1)


rss_url = {
    'yahoo':'http://blog-search.yahoo.co.jp/rss?p=XML&sq=M&ei=UTF-8&so=dd',
    'goo':'http://blog.search.goo.ne.jp/search_goo/result/?MT=XML&dc=10&st=time&ts=goo&from=blog&da=all&tg=all&rss=2&fs=all&rm=1',
    'google':'http://blogsearch.google.co.jp/blogsearch_feeds?hl=ja&q=XML&lr=lang_ja&ie=utf-8&num=10&output=rss',
}

for rss_data in rss_url:
    get_data(rss_data, rss_url[rss_data])





プログラム実行後、管理ツールで確認すると無事登録できているようです。
02_01_20091114161248.png





xslの登録



DB2のXSLTRANSFORMで変換したデータをサーブレットで表示す
ここで使用したものと同じxslを登録します。

/rss/template.xslという名前で登録しました。


#!/usr/bin/env python
# -*- coding:utf-8 -*-
import xmlrpclib

#接続するURL
xmlrpc_url = 'http://admin:@localhost:8080/exist/xmlrpc'

#xml-rpcサービスを作成
srv = xmlrpclib.ServerProxy(xmlrpc_url)

#登録するxslデータ
data = u"""<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <xsl:output method="html" />
    <xsl:template match="/">
        <html xml:lang="ja" lang="ja">
            <xsl:apply-templates select="/rss/channel" />
        </html>
    </xsl:template>
    <xsl:template match="/rss/channel">
        <head>
            <title>
                <xsl:value-of select="title" />
            </title>
            <meta http-equiv="Content-Style-Type" conent="text/css" />
            <style>
                <xsl:comment>
                    .title {
                        font-size: 1.1em;
                        font-weight: bold;
                    }
                    .description {
                        font-size: .9em;
                        margin: 0 0 10px 0;
                    }
                    .list {
                        font-size: .8em;
                        margin:0 0 0 20px;
                    }
                    .list-item {
                        margin: 0 0 5px 0;
                    }
                    .list-item a,
                    .list-item a:link {
                        color: blue;
                    }
                    .list-item a:active,
                    .list-item a:hover {
                        color: red;
                    }
                    .list-item a:visited {
                        color: black;
                        text-decoration: none;
                    }
                    .list-item-date {
                        font-size: .8em;
                    }
                    .list-item-description {
                        font-size: .9em;
                    }
                </xsl:comment>
            </style>
        </head>
        <div class="content-area">
            <div class="title">
                <xsl:value-of select="title" />
            </div>
            <div class="description">
                <xsl:value-of select="description" />
            </div>
            <ul class="list">
                <xsl:apply-templates select="item" />
            </ul>
        </div>
    </xsl:template>
    <xsl:template match="/rss/channel/item">
        <li class="list-item">
            <a href="{link}" title="{description}">
                <xsl:value-of select="title" />
            </a>
            <span class="list-item-date">
                (
                <xsl:value-of select="pubDate" />
                )
            </span>
            <div class="list-item-description">
                <xsl:value-of select="description" />
            </div>
        </li>
    </xsl:template>
</xsl:stylesheet>"""

#rssコレクションにtemplate.xslという名前で保存
srv.parse(data, '/rss/template.xsl', 1)







検索結果の取得



xqueryを発行し、xslを適用済みの結果を取得。
取得した内容をファイルに出力します。


#!/usr/bin/env python
# -*- coding:utf-8 -*-
import xmlrpclib


#接続するURL
xmlrpc_url = 'http://admin:@localhost:8080/exist/xmlrpc'
#xml-rpcサービスを作成
srv = xmlrpclib.ServerProxy(xmlrpc_url)

#xqueryを定義
query = """<rss version="2.0">
<channel>
<title>RSSのマッシュアップ</title>
<description>複数のRSSをXQueryを使ってマッシュアップします</description>
{
for $c in /rss/channel/item
where fn:contains($c/title, 'XML')
order by $c/pubDate descending
return $c
}
</channel>
</rss>"""

params = {'base-uri':'/rss/'}
result_id = srv.executeQuery(query, params)

params = {'stylesheet':'/rss/template.xsl'}

f = open('output.html', 'w')
data = srv.retrieve(result_id, 0, params)
f.write(str(data))
f.close()

#検索結果を破棄
srv.releaseQueryResult(result_id)



予想以上に短いプログラムですみました。


出力されたoutput.htmlを見てみると・・・
02_02_20091114161248.png

ステキ!




テーマ:データベース - ジャンル:コンピュータ

  1. 2010/01/14(木) 12:11:35|
  2. eXist
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

XMLDB eXist 検索結果にxslスタイルシートを適用する

eXistのドキュメントを見ていると、検索結果にxslテンプレートを
適用できるようです。

ちょっと試してみます。



xmlデータ



前回登録したデータを使いまわすことにします。

以下のデータがsample/test.xmlとして登録されている状態です。

<doc>
    <title>日本語タイトル</title>
    <details>日本語詳細</details>
</doc>






xslテンプレート



XSLTスタイルシートの基礎の基礎
http://www.atmarkit.co.jp/fxml/tanpatsu/10xslt/xslt01.html
こちらを参考に、こんなxslを作成しました。


<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>
<xsl:template match="doc">
    <html><xsl:apply-templates/></html>
</xsl:template>
<xsl:template match="title">
    <h1><xsl:value-of select="."/></h1>
</xsl:template>
<xsl:template match="details" >
    <p><xsl:value-of select="."/></p>
</xsl:template>
</xsl:stylesheet>




以下のプログラムを実行し、sample/template.xslを登録します。


#!/usr/bin/env python
# -*- coding:utf-8 -*-
import xmlrpclib

#接続するURL
xmlrpc_url = 'http://admin:@localhost:8080/exist/xmlrpc'

#xml-rpcサービスを作成
srv = xmlrpclib.ServerProxy(xmlrpc_url)

#登録するxslデータ
data = u"""<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>
<xsl:template match="doc">
    <html><xsl:apply-templates/></html>
</xsl:template>
<xsl:template match="title">
    <h1><xsl:value-of select="."/></h1>
</xsl:template>
<xsl:template match="details" >
    <p><xsl:value-of select="."/></p>
</xsl:template>
</xsl:stylesheet>"""

#sampleコレクションにtemplate.xslという名前で保存
srv.parse(data, 'sample/template.xsl', 1)






データの検索



/sample/test.xmlを検索し、結果に/sample/template.xslを適用する
サンプルはこんな感じになります。


#!/usr/bin/env python
# -*- coding:utf-8 -*-
import xmlrpclib

#接続するURL
xmlrpc_url = 'http://admin:@localhost:8080/exist/xmlrpc'

#xml-rpcサービスを作成
srv = xmlrpclib.ServerProxy(xmlrpc_url)

params = {'stylesheet':'/sample/template.xsl'}

#sample/test.xmlを検索
result = srv.getDocumentAsString("/sample/test.xml", params);

#取得したデータを表示
print result




実行してみると

# python sample.py
<html>
<h1>日本語タイトル</h1>
<p>日本語詳細</p>
</html>



ちゃんとxsl適用済みの結果が取得できました。



【参考URL】
XSLTスタイルシートの基礎の基礎
http://www.atmarkit.co.jp/fxml/tanpatsu/10xslt/xslt01.html




テーマ:データベース - ジャンル:コンピュータ

  1. 2010/01/13(水) 12:09:58|
  2. eXist
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

XMLDB eXistにPythonからXML-RPCで接続する(xmlrpclib使用)

PerlからXML-RPC経由でeXistへのデータ登録を試したので、
次はPythonからのデータ登録を試してみます。

Perlでは苦労したのですが・・・
Python eXist(XMLDB)にxmlrpcで接続する

こちらを参考に、あっさり接続できました。



コレクションの作成と、ドキュメントの登録



こんな感じのソースコードで、sampleという名前のコレクションと、
test.xmlという名前のドキュメントの登録を試しました。


#!/usr/bin/env python
# -*- coding:utf-8 -*-
import xmlrpclib

#接続するURL
xmlrpc_url = 'http://admin:@localhost:8080/exist/xmlrpc'

#xml-rpcサービスを作成
srv = xmlrpclib.ServerProxy(xmlrpc_url)

#sampleコレクション作成
srv.createCollection("sample");

#登録するXMLデータ
data = u"""<?xml version="1.0" encoding="UTF-8"?>
<doc>
    <title>日本語タイトル</title>
    <details>日本語詳細</details>
</doc>"""

#sampleコレクションにtest.xmlという名前で上書き保存
srv.parse(data, 'sample/test.xml', 1)




管理ツールで確認してみると、ちゃんと登録されています。
01_01_20091114134829.png





ドキュメントの検索



先ほど登録したドキュメントを検索してみます。


#!/usr/bin/env python
# -*- coding:utf-8 -*-
import xmlrpclib

#接続するURL
xmlrpc_url = 'http://admin:@localhost:8080/exist/xmlrpc'

#xml-rpcサービスを作成
srv = xmlrpclib.ServerProxy(xmlrpc_url)

#sample/test.xmlを検索
#パラメーターの指定なし
result = srv.getDocumentAsString("sample/test.xml", {});

#取得したデータを表示
print result




実行した結果はこちら。

# python sample.py
<doc>
    <title>日本語タイトル</title>
    <details>日本語詳細</details>
</doc>




これはお手軽です。



テーマ:データベース - ジャンル:コンピュータ

  1. 2010/01/12(火) 12:10:49|
  2. eXist
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

XMLDB eXistにPerlからXML-RPCで接続する(RPC::XML使用)

eXistはXML-RPCで接続可能です。
以前はJavaから接続しましたが、(XMLデータベース eXistにJavaから接続する)
今回はPerlからXML-RPCを使用して接続してみたいと思います。



RPC::XMLのインストール



地味に苦労しました。
まず、RPC::XMLが使用するXML::Parserをインストールします。
CPANからXML::Parserをインストールしようとすると、こんなエラーが・・・


cpan> install XML::Parser

CPAN: File::Temp loaded ok (v0.18)

CPAN.pm: Going to build M/MS/MSERGEANT/XML-Parser-2.36.tar.gz

Note (probably harmless): No library found for -lexpat

Expat must be installed prior to building XML::Parser and I can't find
it in the standard library directories. You can download expat from:

http://sourceforge.net/projects/expat/

If expat is installed, but in a non-standard directory, then use the
following options to Makefile.PL:



expatというモジュールに依存しているようです。

Debianのapt-getでインストールしたいのですが、方法がよくわからん。
このページが助け舟になりました。
XML::Parser CPAN install error with Expat.o


# apt-get install expat
# apt-get install libexpat1-dev


これでモジュールがインストールできました。

改めて、CPANから必要なモジュールをインストール


# perl -MCPAN -e shell
cpan> install XML::Parser
cpan> install RPC::XML



これで準備は完了です。




eXistのコレクション作成



これからサンプルで使用するコレクションを作成するプログラムです。
ここらへんは、オフィシャルのマニュアルを参考にしました。
Open Source Native XML Database Developer's Guide

接続するときのURLは

http://[ユーザーID]:[パスワード]@[サーバーID]:[ポート番号]/exist/xmlrpc


となります。
※ユーザーID、パスワードは省略可能。

admin(パスワードは空白)でログインし、sampleというコレクションを作成してみます。


#!/usr/bin/perl

use strict;
use warnings;

use RPC::XML;
use RPC::XML::Client;

my $url = "http://admin:\@192.168.1.250:8080/exist/xmlrpc";
print "connecting to $url...\n";
my $client = RPC::XML::Client->new($url);

my $req = RPC::XML::request->new("createCollection", "sample");
my $response = $client->send_request($req);
if($response->is_fault) {
    die "An error occurred: " . $response->string . "\n";
}

print $response->value, "\n";



これでsampleコレクションが作成できました。




xmlデータの登録



作成したsampleコレクションにxmlデータを登録してみます。

これまた苦労しました。

日本語が含まれるXMLを登録しようとすると、

An error occurred: Failed to parse XML-RPC request: Byte "227" is not a member
of the (7-bit) ASCII character set.



こんなエラーメッセージや、


Wide character in subroutine entry at /usr/local/share/perl/5.10.0/RPC/XML.pm line 892.



こんなエラーメッセージが表示されてしまいます。
※英文のみで構成されたXMLは問題なし。


半分あきらめかけていたのですが、
debian で plagger (4)

こちらを参考にさせていただき、日本語を含むXML文章が登録できるようになりました。

ソースはコチラ。


#!/usr/bin/perl

use utf8;
use strict;
use warnings;

use RPC::XML;
use RPC::XML::Client;

my $url = "http://admin:\@192.168.1.250:8080/exist/xmlrpc";
print "connecting to $url...\n";

my $client = RPC::XML::Client->new($url);

#登録するXMLを作成
my $xml = << "XML_DOC";
<?xml version="1.0" encoding="UTF-8"?>
<doc>
    <title>日本語タイトル</title>
    <details>日本語詳細</details>
</doc>
XML_DOC

#utf8エンコード実行
utf8::encode($xml);

#XMLドキュメントはRPC::XML::base64->new()でラップする
#/[コレクション名]/[ドキュメント名]で保存先を指定する
#最後の1は、上書きOK指定
my $req = RPC::XML::request->new("parse", RPC::XML::base64->new($xml), "/sample/test.xml", 1);
my $response = $client->send_request($req);
if($response->is_fault) {
    die "An error occurred: " . $response->string . "\n";
}

print $response->value, "\n";



キモは、
・use utf8;をちゃんと指定する。
・utf8::encode($xml);でエンコードを実行する。
・RPC::XML::requestに渡すXMLは、RPC::XML::base64に変換する。


これで日本語を含むXMLドキュメントが登録できました。




テーマ:データベース - ジャンル:コンピュータ

  1. 2010/01/11(月) 12:17:12|
  2. eXist
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ