アプリ版:「スタンプのみでお礼する」機能のリリースについて

複数のxmlファイルの合体

XML、JavaScriptのど素人です。諸先輩方のアドバイスを乞いたくよろしくお願いいたします。
XML本のサンプルプログラムで、XML/XSL/JavaScript(html内に記述されている)を用いた
検索プログラムを以下の理由で改良したいと考えています。

<books>
<book>
<data1>データ</data1>
<data2>データ</data2>
<data3>データ</data3>
</book>
</books>
の構造を持つxmlファイルがあったとして
データの更新が頻繁に行われるのは<data3>要素だけなので、

<books>
<book>
<data1>データ</data1>
<data2>データ</data2>
</book>
</books>-----xml1

<books>
<book>
<data3>データ</data3>
</book>
</books>-----xml2
のように2ファイルに分離し、
JavaScriptの検索プログラムで、<data1>~<data3>要素から条件にあったデータを抽出したいのですが
どうすればいいのでしょうか?よろしくお願いします。

A 回答 (2件)

サンプルを見せてもらい、やりたい事もだいたいわかりました。


Msxml2を使って、selectNodes(strFlt)のメソッドでXPATH指定を引数にして
ダイレクトにヒットするノードを取ってくるのですね。

申し訳ありませんが、私はXLTやXPATHの機能や記述をよくしらないので、
1、2、の改良要望が簡単に出来るかどうかはわかりません。
別途質問を投稿すれば回答か得られると思います。

3については、for(i=0;i<clnNod.length;i++)の
部分のclnNod.lengthが件数だから、これを表示するだけですね。
4のXMLを2つに分けて、それぞれから検索する事も、objDocをもう一組、下のように
作って、objDoc2の方も同じように検索すれば可能ですが、
  var objDoc2=new ActiveXObject("Msxml2.DOMDocument");
  objDoc2.async=false;
  objDoc2.load("2.xml");
そもそも、2.xmlの中から何をキーにしてpriceを取り出すのかが、ご質問の内容からは、
わかりません。仮にキーで検索するとしても、それぞれのxmlを同期モード(async=false)で
読み込んでいるから、処理効率が上がるとは思えません。むしろ1つのXMLから一度に検索し
た方が早いです。
非同期モードにして、2つのXMLを並列に検索して、両方の処理が完了した時点で結果をDOMに
書き込むようにすれば、効率は上がるのかも?
この場合、かなりPGMを修正する必要があります。

それから、結果の書き出しについてですが、フレームで分ける必要は無いと思います。
結果の<div>ブロックを準備して中身をDOMアクセス手法で書いたり消したりした方が簡単だと
思います。

さらに個人的な意見ですが、Msxml2は使いたくないですね。IEしか使えなく、IEのシェアは
年々減少しているからです。それと、大量データのXMLのJavascript DOM処理は、資源を使い
すぎて遅いです。XPATHは、がSAXみたいな処理なんでしょうかねえ?。もし可能なら、この
手の処理はDBを使ってサーバ側でPHPでも使って、ちゃちゃっとやった方がずっと簡単だと
思います。

この回答への補足

わざわざ私ごときのために考えてくださりホント~に感謝申し上げます。

>clnNod.lengthが件数だから、これを表示するだけですね。
具体的にどの箇所にどう書き込めば表示されるのでしょうか?
試行錯誤しながら以下の2行をそれぞれ思う箇所にいろいろ貼り込んでもどうしても表示されませんでした。
writeln(<div id="countArea"></div>");
document.getElementById("countArea").innerHTML= clnNod.length + "件ヒット"

>大量データのXMLのJavascript DOM処理は、資源を使いすぎて遅いです。
試しに実際のデータ量で検索比較してみたところ、xmlデータの検索は、これまで使っているhtmlデータの検索よりも、3-5倍近く時間がかかりました。

>結果の書き出しについてですが、フレームで分ける必要は無いと思います。
実際の使用では、検索結果が1ページでは収まらないため、スクロールすると検索ボックスが見えなくなるので、フレームを使っている次第です。

>Msxml2は使いたくないですね。IEしか使えなく、IEのシェアは年々減少しているからです。
Msxml以外に何があるのですか?私はIEの愛用者ですが、どのbrowserが人気傾向にあるのですか?それはなぜですか?

>この手の処理はDBを使ってサーバ側でPHPでも使って、ちゃちゃっとやった方がずっと簡単だと思います。
自前のサーバ理想的ですね。でもお金かかりそうだし、かなり勉強しなきゃいけない感じがして気が引けます。


5年ほど前から
http://www2s.biglobe.ne.jp/~iryo/java/java1/engf …さん
の検索プログラムを以下のようにアレンジして(とは言っても、ボタン類を画像にしたり、データ部分をhtmlタグで飾り立てているだけですが)使っていますが、「プルダウンメニュを追加する」ことで、ジャンルを絞り込んで、テキストボックスで文字検索できればなぁと考えているのですが、ヒントでもいただけると嬉しいです。
なぜ、xmlに惹かれたかというと、xmlデータがツリー構造を保持してさえいれば、表示方法を簡単に変えられることと、頻繁に使う同じ長ったらしい文字列を実体参照(ENTITY)で短い文字列に置き換えることができるという点です。


htmlをフレームを使って上下に、検索ボタン用ページ(name=up)と結果表示用ページ(name=down)に2分割

★検索ボックス部分
<IMG SRC="clearbutton.png" onclick="parent.down.document.location.href='down.htm'; parent.up.document.location.href='up.htm'" title="クリア・ボタン">
<IMG SRC="searchbutton.png" onClick="return check()" title="検索ボタン">
<FORM name=gto onSubmit="return check()" ><INPUT name=box type="text" title="検索ボックス"></FORM>

★検索エンジン部分(js)
c = 0;
dta ='a,b,c,d,e,f,g,h,i,j,k,l,m,n,';
dta +='o,p,q,r,s,t,u,v,w,x,y,z,';
dtc='a,b,c,d,e,f,g,h,i,j,k,l,m,n,';
dtc +='o,p,q,r,s,t,u,v,w,x,y,z,';
mae1=dta.split(',');
ato1=dtc.split(',');
function check(){
cstr1 = document.gto.box.value;
n1=0;cstr='';
cstr1 = cstr1.toLowerCase()
for (i=0; i<cstr1.length; i++)
{
moz = cstr1.charAt(i);
n1 = dta.indexOf(moz,0);
if (n1 >= 0){
for(j=0;j<mae1.length;j++){
na = mae1[j].indexOf(moz,0);
if (na >= 0){
moz = ato1[j];
break;
}
}
}
cstr += moz;
}
parent.down.document.write('<HTML>');
parent.down.document.write('<META http-equiv=Content-Type content="text/html; charset=shift_jis">');
parent.down.document.write('<HEAD><LINK href="js/stock.css" type=text/css rel=stylesheet></HEAD>');
parent.down.document.write('<BODY>');

for(i=1; i<999; i++){
n = dt[i].indexOf(cstr,0);
if (n > 0)
{c=c+1;parent.down.document.write(dt[i]+'');}
}
if(c==0)
parent.down.document.write('「',cstr,'」 を含む索引名はありません。');
else
parent.down.document.write('「',cstr,'」 を含む索引名を 「',c,'」 個検出しました。');
c=0;
}

★データ部分(js)
dt=new Array();
dt[1]='<table><tr><td>data1</td><td>data2</td></tr></table>'
dt[2]='<table><tr><td>data3</td><td>data4</td></tr></table>'
以下省略

補足日時:2008/11/27 21:42
    • good
    • 0

XML本のサンプルプログラムをそのまま載せて下さい。

この回答への補足

ご覧いただきありがとうございます。改めて質問させていただきます。
XML本付録のサンプル検索プログラムについて、以下の4点を改良したいと思い、必死にネットで調べましたが、JavaScriptの知識がないためなのか、参考になるページを見つけることが出来ませんでした。
どうかお助けください。

1. 現状ではテキストボックスの検索は、作者名が完全に一致しないと検出されないので、データ:夏目漱石に対して、検索語:夏目でもヒットするように部分一致検索できるようにしたい。
2. 英数字の大文字・小文字の区別なしに、検出できるようにしたい。
3. 結果表示ページに検索ヒット件数を表示させたい。
4. オリジナルのXMLを、最下記のように2つに分けて機能させたい。

プログラムの仕組みは、フレームを使ってhtmlを上下に、検索ページ(name="up")と結果表示ページ(name="down")に分け、プルダウンメニューから「本のジャンル」を選び、更にテキストボックスに「作者名」を入力して、DOMを介して、XMLデータから2つの条件にマッチするデータを抽出して<price>データを付加するというものです。

【検索用html】
<form name="form">
<select name="type">//プルダウンメニュー
<option value="" selected="selected">すべて</option>
<option value="ジャンルA">ジャンルA</option>
<option value="ジャンルB">ジャンルB</option>
</select>
<input type="text" name="author" size="15" maxlength="15" />//テキストボックス
<input type="button" name="srch" value="検索" onclick="disp()"/>//検索ボタン
</form>

【検索用js】
function disp(){
var strTyp=parent.up.form.type.value;
var strAut=parent.up.form.author.value;

var objDoc=new ActiveXObject("Msxml2.DOMDocument");
objDoc.async=false;
objDoc.load("books.xml");

flg=false;

strFlt="/books/book";

if(strTyp!=""){
strFlt+="[(type = '" + strTyp + "')";
flg=true;
}
if(strAut!=""){
if(flg){
strFlt+=" and ";
}else{
strFlt+="[";
flg=true;
}
strFlt+="(author ='" + strAut + "')";
}
if(flg){strFlt+="]";}

var clnNod=objDoc.selectNodes(strFlt);

with(parent.down.document){
open("text/html");
writeln("<html><head><type>検索結果</type>");
writeln("<link rel=\"stylesheet\" type=\"text/css\" href=\"book2.css\" />");
writeln("</head><body>");
var cnt=1;
for(i=0;i<clnNod.length;i++){
objNod=clnNod.item(i);
objTyp=objNod.selectSingleNode("type");
objAut=objNod.selectSingleNode("author");
objPrc=objNod.selectSingleNode("price");

writeln("<table border='0'><tr><td>");
writeln(objTyp.text + "(" + objAut.text + ")");
writeln("</td></tr><tr><td>");
writeln(objPrc.text + "円</td></tr></table>");
}
writeln("</body></html>");
close();}}

【XMLデータ】
<books>
<book>
<type>ジャンルA</type>
<author>作者A</author>
<price>2000</price>
</book>
<book>
<type>ジャンルB</type>
<author>作者B</author>
<price>1000</price>
</book>
</books>

●編集しやすいように上のxmlファイルを、以下のように検索対象ノードと非検索対象ノード用に2つに分けたい
1.xml
<books>
<book><type>ジャンルA</type><author>作者A</author></book>
<book><type>ジャンルB</type><author>作者B</author></book>
</books>

2.xml
<books>
<book><price>2000</price></book>
<book><price>1000</price></book>
</books>

補足日時:2008/11/26 20:40
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!