複数の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件)
- 最新から表示
- 回答順に表示
No.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>'
以下省略
No.1
- 回答日時:
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>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
XMLサイトマップの登録方法がわ...
-
XMLを作成してもタグしか表示さ...
-
ワードで文字を入力する時の変...
-
ファイル名の一部削除について
-
XPathで途中に名前空間が設定さ...
-
公文書のxmlファイルの開き方が...
-
XML、XSLTの適応エラー(IEから...
-
タモリさんを信じられますか?
-
スマホのスプレッドシートでセ...
-
XMLデータを変換し印刷する方法
-
ray-mmdについて
-
VBA XML の置換方法
-
自分のHTMLサイトでRSSを読み込...
-
ゲーミングPCに入っているAlris...
-
【BAT(バッチ)ファイル】Web...
-
XMLとは何ですか?
-
特殊文字の検索方法
-
フォルダー内検索
-
Webページに関するさまざまな情...
-
head要素
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのXML処理でメモリが足りない?
-
XMLデータを文字列分割&処理す...
-
複数のxmlファイルの合体
-
VB6でXMLを処理するには
-
下から○番目のデータを表示は可...
-
JavaプログラマとしてのXML
-
xmlからデータを取り出す
-
simplexml_load_fileでのXML
-
CPUの考え方を教えてください ...
-
XMLで要素が記述された順番に意...
-
東芝のDynabookなのですがアン...
-
ルート要素ノードが2個ある場合?
-
SNMP リンクダウンとノードダ...
-
バッチファイルでテキストファ...
-
昔Winnyってありましたけど、あ...
-
VBSでxmlの値を書き換えたい
-
XML、XSLTの適応エラー(IEから...
-
特殊記号が勝手にエスケープさ...
-
同じタグ名の項目取得
-
xmlファイルが上手にHTMLに変換...
おすすめ情報