• 締切済み

複数のxmlファイルの合体

複数の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>要素から条件にあったデータを抽出したいのですが どうすればいいのでしょうか?よろしくお願いします。

  • XML
  • 回答数2
  • ありがとう数4

みんなの回答

  • yyr446
  • ベストアンサー率65% (870/1330)
回答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でも使って、ちゃちゃっとやった方がずっと簡単だと 思います。

taimaiman
質問者

補足

わざわざ私ごときのために考えてくださりホント~に感謝申し上げます。 >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/engform.htmlさん の検索プログラムを以下のようにアレンジして(とは言っても、ボタン類を画像にしたり、データ部分を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>' 以下省略

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

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

taimaiman
質問者

補足

ご覧いただきありがとうございます。改めて質問させていただきます。 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

  • XMLファイルからsql文

    javascriptでXMLファイルからsql文を用いてデータ抽出するには どのようにプログラムを組めばいいのでしょうか?

  • XSL内でJavaScriptを記述し、JavaScript内でXMLデータを取得するには・・・

    大変困っていますのでよろしくお願いします。 XSLのファイル内でJavaScriptを記述し、JavaScriptでxmlの要素を取得操作したいのですが、とり方がわかりません。 ご教授のほどをよろしくお願いします。 ================================================================== sample.xsl ------------------------------------------------------------------ <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head> <title>XML: 基本サンプル</title> </head> <body> <p align="center">サンプル</p> <xsl:apply-templates select="information/value/applicationinfo" /> </body> </html> </xsl:template> <xsl:template match="value/applicationinfo"> <Script Language = "JavaScript"> <xsl:comment> <![CDATA[ document.write("<xsl:value-of select=\"componentname\" />"); ]]> </xsl:comment> </Script> <table border="1"> <tr> <td><xsl:value-of select="componentname" /></td> </tr> </table> </xsl:template> </xsl:stylesheet> ================================================================== 下のテーブルでは要素を表示することはできます。 このやり方では駄目なのでしょうか?

    • ベストアンサー
    • XML
  • XSLTでの複数のXML検索結果を統合するには?

    初歩的な質問でごめんなさい。 XSLTを使って複数のXMLを検索した結果を、表示したいのですが、結果を1つのテーブルに統合するにはどうすればいいのでしょう。 次のスクリプトを基に作りたいのですが。 function search (keyword) { node = thexsl.XMLDocument.selectSingleNode("//xsl:for-each"); if(keyword) node.setAttribute("select", "//data[contains(word, '" + keyword + "')]"); else node.setAttribute("select", "//data"); str = thexml.XMLDocument.transformNode(thexsl.XMLDocument); view1.innerHTML = str; } 次のファイルを利用して検索したいです、 <xml id="thexml1" src="db1.xml"></xml> <xml id="thexml2" src="db2.xml"></xml> <xml id="thexml3" src="db3.xml"></xml> <xml id="thexsl" src="db.xsl"></xml> xmlファイルの内容 <?xml version="1.0" encoding="utf-8" ?> <dataroot xml:lang="ja"> <data>・・・</data>  ・・・ </dataroot> xslファイルの内容 <?xml version="1.0" encoding="utf-8" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <table> <tr>・・・</tr> <xsl:for-each select="//data"> <tr>・・・</tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet> よろしくお願いします。

    • 締切済み
    • XML
  • XSLTの処理について

    いつもお世話になっております。 XMLの動作についての質問です。以下のようなXMLファイルがあったとします。それに対して、その下のようなXSLファイルがあり、変換させると、結果XMLができます。 そこでわからないのは、test.xslの中ほどで、<xsl:template match="book/title/price">という風にXPath式でbook/title/priceと指定しているのに、結果には<title>の値も出力されます。なぜでしょうか。 自分のイメージとしては、<title>の値は出力されず<price>の値だけが出力されるのじゃないのかなっていう感じです。さらに<newTag>に<title>の値が挟まれていないのもなぜなのかわかりません。 お分かりになる方よろしくお願いします。もし参考文献に良いサイトや本がありましたらそちらも紹介をお願いします。 <<<test.xml>>> <?xml version="1.0" encoding="Shift_JIS"?> <books>  <book>   <title>    XMLとは    <price>2000</price>   </title>  </book>  <book>   <title>    XML概論    <price>1800</price>   </title>  </book>  <book>   <title>    XMLマスター    <price>4000</price>   </title>  </book> </books> <<<test.xsl>>> <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/">  <answer>   <xsl:apply-templates select="books/book"/>  </answer> </xsl:template> <xsl:template match="book/title/price">  <newTag>   <xsl:value-of select="."/>  </newTag> </xsl:template> </xsl:stylesheet> <<<結果.xml>>> <?xml version="1.0" encoding="utf-8" ?> <answer> XMLとは <newTag>2000</newTag> XML概論 <newTag>1800</newTag> XMLマスター <newTag>4000</newTag> </answer>

    • ベストアンサー
    • XML
  • DOMでXML操作

    PHP5でDOMを操作しXMLのタグ情報などを得たいのですがプログラムが動かないので質問させていただきました。 //test.php <?php $doc = new DomDocument; $doc->validateOnParse = true; $doc->Load('book.xml'); echo "ID が books の要素は".$doc->getElementById('books')->tagName . " です。\n"; ?> //book.xml <?xml version="1.0" encoding="shift_JIS"?> <A>   <B id="books">test</B> </A> サンプルプログラムを拾ってきてbooksのtestを取得したいのですがなかなか動きません。実行するとエラー文も何もなく「ID が books の要素は です。 」とだけ表示されます。 環境そのものが整っていないのかも解らないため詳しい方ご教授よろしくお願いします。 現在の環境です。 PHP5 Apache2.0

    • ベストアンサー
    • PHP
  • JavaでXMLをファイルからじゃなく扱いたい

    Javaで例えば、String変数に String str = "<xml sample>hogehoge</xml sample>" みたいにXML形式のデータが入っているとして、このデータを、XMLファイルをDOMで扱う時のように扱えないでしょうか?一度、ファイルに書きだして、XMLファイルとして読み込ませないと難しいでしょうか?

    • ベストアンサー
    • Java
  • sgmlからXMLへの変換

    sgmlからXMLへの変換のプログラムを考えています。 XSLを利用してWebBrowserに取り込むことで変換しようと考えていますが、何かサンプルプログラムコードがありましたら教えてください。 よろしくお願いいたします。

  • sgmlからXMLへの変換

    sgmlからXMLへの変換のプログラムを考えています。 (VB6) XSLを利用してWebBrowserに取り込むことで変換しようと考えていますが、何かサンプルプログラムコードがありましたら教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • XML
  • (大至急)JavaScriptの質問です

    xmlファイルを読み込んで 書籍1: Title:ハリーポッター ・ ・ 書籍2: Title:広辞苑 ・ ・ 書籍3: ・ ・ のように表示させるJavaScriptのプログラム(拡張子はhtml)を作りたいのですが、上手く行きません。大至急教えて頂けないでしょうか?!本当に困ってます・・・ ///////////作りかけのJavaScriptプログラム//////// <HTML> <script> xmldoc=new ActiveXObject("Microsoft.XMLDOM"); xmldoc.load("Books.xml"); var str=""; var i=0,j=0,imax=0; imax = xmldoc.documentElement.childNodes.length; var Titles = xmldoc.documentElement.getElementsByTagName("Title"); var Authors = xmldoc.documentElement.getElementsByTagName("Author"); var Prices = xmldoc.documentElement.getElementsByTagName("Price"); for(var i=0;i< imax;i++){ str=str+xmldoc.documentElement.childNodes.item(i).text+"<BR />"; document.writeln(str); } </script> <body> </body> </HTML> ///////////作りかけのJavaScriptプログラム//////// ////////////Books.xml////////////// <?xml version="1.0" encoding="SHIFT_JIS" ?> <?xml-stylesheet type="text/xsl" href="kadai3.xsl" ?> <Books> <Book> <Title>ハリーポッター</Title> <Author>j.kローリング</Author> <Price>3800</Price> </Book> <Book> <Title>広辞苑</Title> <Author>鈴木太郎</Author> <Price>6800</Price> </Book> <Book> <Title>魚の図鑑</Title> <Author>田中雅夫</Author> <Price>4500</Price> </Book> </Books> ////////////Books.xml//////////////

  • ActionScript3でのXML操作

    ActionScriptの初心者です。お世話になります。 既存のXMLにデータを追加していきたいのですがやり方がわかりません。データは以下のようなフォーマットです。 <books> <book> <title>...</title> <author priority="1">...</author> <!--■authorのpriorityを参照してこの辺に追加したりします--> <author priority="2">...</autor> <book> <books> Web上、adobeのリファレンスでいろいろ探したのですが、ほとんどXMLのデータを参照する方法しか紹介されていません。XMLのデータにタグを追加したり、削除したりする方法、またはWeb上のサンプル等何でもよいので、おしえていただけますでしょうか? または、XMLクラスを使わず行単位で正規表現で文字処理する方法でもかまいません。よろしくお願いします。m(_*_)m バージョン:AcrionScript3.0 (XMLDocumentなどのクラスを使わず、W3Cで定義されているXPathのようなアクセス方法、.とか、@とかでアクセスする方法です。)

    • ベストアンサー
    • Flash

専門家に質問してみよう