伸び縮みマークアップ言語 XML
★本ページはプロモーションが含まれています★
■ DOMとjavascriptで検索機能を作成する 1

■ XML文書内を検索

javascriptとDOMを利用して、XML文書内を検索・表示する機能を作成します。 HTMLの入力欄(inputタグ)に入力されたキーワードに合致するデータを検索して、 画面に表示します。以下は具体的な機能・処理の流れです。

HTML文書内の入力欄にキーワードを入力し、検索を実行
▼ ▼
javascriptによってXML文書が読み込まれ、DOMツリーを生成
▼ ▼
入力されたキーワードに合致するデータを検索
▼ ▼
キーワードに合致するデータを新しいDOMツリーに追加
▼ ▼
XSLTスタイルシートを読み込み、ツリーに適用
▼ ▼
結果を表示

これらの機能を実現する為に、これから何回かにわたって一つ一つの機能を 説明・追加作成していきます。今回は 入力欄の検索キーをクリックすると、DOMツリーを参照して表示してみます。

では、例題を取り上げてみましょう。
以下の2つのファイルをご覧下さい。XML文書を「samp06.xml」、 HTML文書を「sam06.html」とします。

■ samp06.xml

<?xml version="1.0" encoding="shift_jis"?>
<会員>
 <会員データ>
  <番号>1</番号>
  <氏名>伸縮○二郎</氏名>
  <住所>東京</住所>
 </会員データ>
 <会員データ>
  <番号>2</番号>
  <氏名>伸縮○美</氏名>
  <住所>大阪</住所>
 </会員データ>
 <会員データ>
  <番号>3</番号>
  <氏名>伸縮○雄</氏名>
  <住所>名古屋</住所>
 </会員データ>
 <会員データ>
  <番号>4</番号>
  <氏名>伸縮和○</氏名>
  <住所>東京</住所>
 </会員データ>
</会員>

■ sam06.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=shift_jis">
<title>XML文書を検索 1</title>
<script language="JavaScript">
function Search(ky)
{
var obXML = new ActiveXObject('microsoft.XMLDOM');
obXML.async = false;
obXML.load('samp06.xml');

var Rnode = obXML.documentElement;
var string = "";
string = "ルートノード名:" + Rnode.nodeName + "<br>";

if(Rnode.hasChildNodes())
{
var Dnum = Rnode.childNodes.length;
var Dname1 = Rnode.childNodes.item(0).childNodes.item(1).text;
var Dname2 = Rnode.childNodes.item(1).childNodes.item(1).text;
var Dname3 = Rnode.childNodes.item(2).childNodes.item(1).text;
var Dname4 = Rnode.childNodes.item(3).childNodes.item(1).text;

string += "sam06.xml内に記述されたデータの氏名は以下の" + Dnum + "件です。<br>";
string += "1" + Dname1 + "<br>";
string += "2" + Dname2 + "<br>";
string += "3" + Dname3 + "<br>";
string += "4" + Dname4 + "<br>";
}
else
{
string += "該当データなし<br>";
}
hyouji.innerHTML = string;
}
</script>
</head>

<body>
<div align="center">
<form name="f1">
<input type="text" size="40" name="ky">
<input type="button" name="sbutton" value="検索" onClick="Search(ky)">
</form>
<hr> <div id="hyouji" align="left"></div>
</div>
</body>
</html>

■ XML文書の読み込み

var obXML = new ActiveXObject('microsoft.XMLDOM');
obXML.async = false;
obXML.load('samp06.xml');

XML文書のオブジェクトを生成し(obXML)、XML文書を読み込んでいます。

■ ルートノードを参照

var Rnode = obXML.documentElement;
var string = "";
string = "ルートノード名:" + Rnode.nodeName + "<br>";

変数「Rnode」にルートノードを代入して参照し、ルートノードの情報を表示します。

■ 子ノードの参照

var Dname1 = Rnode.childNodes.item(0).childNodes.item(1).text;
var Dname2 = Rnode.childNodes.item(1).childNodes.item(1).text;
var Dname3 = Rnode.childNodes.item(2).childNodes.item(1).text;
var Dname4 = Rnode.childNodes.item(3).childNodes.item(1).text;

「childNodes.item(0)」で最初に出現する子ノードを参照します。さらに「childNodes.item(1)」を繋げる事で 、その子ノードの配下にある子ノードを参照することが出来ます。「.text」でその子ノードのテキストを読みます。 これらによって、各子ノードにある氏名ノードのテキストを、変数「Dname1」「Dname2」「Dname3」「Dname4」に それぞれ代入されます。

変数「Dname1」「Dname2」「Dname3」「Dname4」に代入されたテキストはjavascriptの記述より、 inputタグの「onClick="Search(ky)"」によって画面に表示されます。

sam06.htmlの実行結果は以下のようになります。

sam06HTMLファイルの表示結果


■ DOMとjavascriptで検索機能を作成する 2

■ 文字列の比較・検索

入力された文字列と、ノードのテキストを比較・検索する機能を作成します。 文字列比較の関数である「compareString」で2つの変数を指定し、 同じならばtrueが返され、違うならばfalseを返します。 文字列の比較は「if文」で比較演算子を使用して行います。 入力した文字列と同じ文字が、参照したノード内に存在しない場合に、 「else文」を実行します。

文字列内の検索には「indexOf」を使用します。

compareString(変数,変数)

変数 = 比較の対象となる文字列.indexOf(文字列)

上記のように、indexOfメソッドを使用して、比較対象となる文字列の中に()内の文字列が含まれていないかを 調べます。対象となる文字列の中に文字がある場合は、変数に位置を数値で返し、 文字が含まれていない場合は「-1」を返します。

では、例題を取り上げてみましょう。
以下の2つのファイルをご覧下さい。XML文書を「samp07.xml」、 HTML文書を「sam07.html」とします。 簡潔にするために、前回使用したXML文書を短くしてファイル名を変え、使用します。

■ samp07.xml

<?xml version="1.0" encoding="shift_jis"?>
<会員>
 <会員データ>
  <番号>1</番号>
  <氏名>伸縮○二郎</氏名>
  <住所>東京</住所>
 </会員データ>
</会員>

■ sam07.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=shift_jis">
<title>XML文書を検索 2</title>
<script language="JavaScript">
function Search(ky)
{
var obXML = new ActiveXObject('microsoft.XMLDOM');
obXML.async = false;
obXML.load('samp07.xml');
var Rnode = obXML.documentElement;
var string = "";
if(Rnode.hasChildNodes())
{
var Dnum = Rnode.childNodes.item(0).childNodes.item(1).text;
string += "入力された文字列は" + Dnum + "に";
if(compareString(ky.value,Dnum))
{
string += "等しいか含まれている";
}
else
{
string += "等しくないか含まれていない";
}
}

else
{
string += "データなし";
}
hyouji.innerHTML = string;
}
function compareString(inputky,nodetext)
{
if(inputky == "")
{return false;}
if(inputky == nodetext)
{
return true;
}
else
{
var ofs = nodetext.indexOf(inputky);
if(ofs != -1)
{
return true;
}
return false;

}
}
</script>
</head>

<body>
<div align="center">
<form name="f1">
<input type="text" size="40" name="ky">
<input type="button" name="sbutton" value="検索" onClick="Search(ky)">
</form>
<hr> <div id="hyouji" align="left"></div>
</div>
</body>
</html>

■ 文字列比較処理

if(compareString(ky.value,Dnum))
{
string += "等しいか含まれている";
}
else
{
string += "等しくないか含まれていない";
}
}

文字列比較の処理を行う関数「compareString」をif文で呼び出しています。 2つの値が同じなら「true」が返されて「等しいか含まれている」が表示され、 異なる場合、「false」が返されて「等しくないか含まれていない」が表示されます。

■ 文字列比較処理関数の中身

compareString(inputky,nodetext)
{
if(inputky == "")
{return false;}
if(inputky == nodetext)
{
return true;
}
else
{
var ofs = nodetext.indexOf(inputky);
if(ofs != -1)
{
return true;
}
return false;

「compareString」で文字列比較処理を行います。(上のif文で呼び出されている関数です。) まず、入力文字列が空「##」(なにも無い)時は、「false」を返します。 入力文字列が空でない場合に、「indexOf」を使用して変数「inputky」が変数「nodetext」 の値の中に含まれているかを調べ、それを変数「ofs」に格納します。 「ofs」に格納された値が「-1」(文字列が含まれていない)以外の場合、 「true」を返します。

sam07.htmlの実行結果は、フォームに入力された文字列が、 samp07.xml文書の氏名ノードのテキストである「伸縮○二郎」に 等しいか含まれている場合は以下の「B」のように表示され、 等しくないか含まれていない場合は以下の「A」のように表示されます。

sam06HTMLファイルの表示結果


■ DOMとjavascriptで検索機能を作成する 3

■ 繰り返し処理でノード内を検索

for文で繰り返し処理を行います。

for(変数 = 0; 変数 <= 子ノードの数; 変数++)

上記のように、まず始めに変数の開始値を「0」(変数 = 0)に、そして 真ん中の条件式(変数 <= 子ノードの数)が成り立つ間、for文の中に書かれた 処理を繰り返し、一回処理を行うたびに変数に「1」を加算(変数++)していきます。

変数の数値が増えていき、(変数 <= 子ノードの数)が成り立たなくなったら for文から抜けます。前回と違う点は、前回はある特定のノードテキストに対し、 検索処理を行うだけだったという所です。今回は子ノードの数だけ処理を行います。

では、例題を取り上げてみましょう。
以下の2つのファイルをご覧下さい。XML文書を「samp08.xml」、 HTML文書を「sam08.html」とします。

■ samp08.xml

<?xml version="1.0" encoding="shift_jis"?>
<会員>
<会員データ>
<番号>1</番号>
<氏名>伸○二郎</氏名>
<住所>東京</住所>
</会員データ>
<会員データ>
<番号>2</番号>
<氏名>伸縮○美</氏名>
<住所>大阪</住所>
</会員データ>
<会員データ>
<番号>3</番号>
<氏名>伸谷○雄</氏名>
<住所>名古屋</住所>
</会員データ>
<会員データ>
<番号>4</番号>
<氏名>伸縮和○</氏名>
<住所>東京</住所>
</会員データ>
</会員>

■ sam08.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=shift_jis">
<title>XML文書を検索 3</title>
<script language="JavaScript">
function Search(ky)
{
var obXML = new ActiveXObject('microsoft.XMLDOM');
obXML.async = false;
obXML.load('samp08.xml');
var Rnode = obXML.documentElement;
var hzn = new ActiveXObject('microsoft.XMLDOM');
var Rhzn = hzn.createElement("会員");
var string = "";
var tx = "";

if(Rnode.hasChildNodes())
{
for(i = 0;i <= Rnode.childNodes.length – 1;i++)
{
tx = Rnode.childNodes.item(i).childNodes.item(1).text;
if(compareString(ky.value,tx))
{
string += "・" + tx + "
";
Rhzn.appendChild(Rnode.childNodes.item(i));
i = i – 1;
}

}
}
else
{
string += "データなし<br>";
}
hyouji.innerHTML = string;
}
function compareString(inputky,nodetext)
{
if(inputky == "")
{return false;}
if(inputky == nodetext)
{
return true;
}
else
{
var ofs = nodetext.indexOf(inputky);
if(ofs != –1)
{
return true;
}
return false;
}
}
</script>
</head>

<body>
<div align="center">
<form name="f1">
<input type="text" size="40" name="ky">
<input type="button" name="sbutton" value="検索" onClick="Search(ky)">
</form>
<hr> <div id="hyouji" align="left"></div>
</div>
</body>
</html>

■ 検索したテキストの格納

var hzn = new ActiveXObject('microsoft.XMLDOM');  ・・
var Rhzn = hzn.createElement("会員");  ・・
var string = "";
var tx = "";  ・・


に検索したノードを保存し、 「createElement」で子ノードの追加をする事ができるので、ルートノードである「会員」を 追加してに格納します。そして に繰り返し検索したテキストを格納します。

■ 繰り返してノードを検索

for(i = 0;i <= Rnode.childNodes.length – 1;i++)
{
tx = Rnode.childNodes.item(i).childNodes.item(1).text;
if(compareString(ky.value,tx))
{
string += "・" + tx + "
";
Rhzn.appendChild(Rnode.childNodes.item(i));
i = i – 1;
}


for文で子ノードの数だけ処理を繰り返します。 繰り返しノードのテキストを変数「tx」に格納し、入力文字列と「tx」を 「compareString」で比較して合致した場合、stringに代入された文字列が表示されます。 検索したノードは、「appendChild」で変数「Rhzn」下に追加します。 「appendChild」はノードを追加すると、元のノードを削除します。(全体数が1減ってしまう) したがって「appendChild」を実行後は「i-1」とすることにより、次に処理するノードを 飛ばさないようにします。

sam08.htmlの実行結果は、それぞれ以下のように表示されます。

sam08HTMLファイルの表示結果


■ DOMとjavascriptで検索機能を作成する (XSLTスタイルシート適用)

■ XSLTスタイルシートを適用させる

今まではXML文書とHTML文書だけで検索結果を表示させてきましたが、 今回はXSLTスタイルシートを適用させる事で結果を整えて表示させます。 ここでは更にHTML文書にCSS文書も追加して見栄えよくします。

createProcessingInstruction」でXML宣言を作成、
insertBefore」により作成したDOMツリーにそれらを追加します。
そうして完成したXML文書にXSLTスタイルシートを適用させて結果表示させます。

変数名.createProcessingInstruction("xml","バージョン");

XML宣言を作成します。

変数名.insertBefore("追加するノード","追加する位置のノード");

作成したXML宣言をDOMツリーに追加します。

では、例題を取り上げてみましょう。
以下の4つのファイルをご覧下さい。XML文書を「samp09.xml」、 HTML文書を「sam09.html」、 適用させるXSLTスタイルシートは「xslt09.xsl」とします。 HTML文書に読み込むスタイルシートは(CSS)「css09.css」です。

■ samp09.xml

<?xml version="1.0" encoding="shift_jis"?>
<会員>
<会員データ>
<番号>1</番号>
<氏名>伸○二郎</氏名>
<住所>東京</住所>
</会員データ>
<会員データ>
<番号>2</番号>
<氏名>伸縮○美</氏名>
<住所>大阪</住所>
</会員データ>
<会員データ>
<番号>3</番号>
<氏名>伸谷○雄</氏名>
<住所>名古屋</住所>
</会員データ>
<会員データ>
<番号>4</番号>
<氏名>伸縮和○</氏名>
<住所>東京</住所>
</会員データ>
</会員>

■ xslt09.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>
   <body>
    <table border="1">
     <tr>
      <th>番号</th>
      <th>氏名</th>
      <th>住所</th>
     </tr>
     <xsl:apply-templates select="会員データ">
      <xsl:sort select="番号" data-type="number"/>
     </xsl:apply-templates>
    </table>
   </body>
  </html>
 </xsl:template>
 <xsl:template match="会員データ">
  <tr>
   <td><xsl:value-of select="./番号"/></td>
   <td><xsl:value-of select="./氏名"/></td>
   <td><xsl:value-of select="./住所"/></td>
  </tr>
 </xsl:template>
</xsl:stylesheet>

■ css09.css

input {background-color:#ccccff}
table {border-width:0px; width:400px}
th {background-color:#99cc99}

■ sam09.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=shift_jis">
<title>XML文書を検索 3</title>
<link rel="stylesheet" href="css09.css" type="text/css">
<script language="JavaScript">
function Search(ky)
{
var obXML = new ActiveXObject('microsoft.XMLDOM');
obXML.async = false;
obXML.load('samp09.xml');
var Rnode = obXML.documentElement;
var hzn = new ActiveXObject('microsoft.XMLDOM');
var Rhzn = hzn.createElement("会員");
var string = "";
var tx = "";
if(Rnode.hasChildNodes())
{
for(i = 0;i <= Rnode.childNodes.length – 1;i++)
{
tx = Rnode.childNodes.item(i).childNodes.item(1).text;
if(compareString(ky.value,tx))
{
Rhzn.appendChild(Rnode.childNodes.item(i));
i = i – 1;
}
}
}
else
{
string += "データなし<br>";
hyouji.innerHTML = string;
return;
}
var sen = hzn.createProcessingInstruction("xml", 'version="1.0"');
hzn.insertBefore(sen, hzn.childNodes.item(0));
hzn.appendChild(Rhzn);
var obXSL = new ActiveXObject('microsoft.XMLDOM');
obXSL.async = false;
obXSL.load("xslt09.xsl");
hyouji.innerHTML = hzn.transformNode(obXSL);
}
function compareString(inputky,nodetext)
{
if(inputky == "")
{return false;}
if(inputky == nodetext)
{
return true;
}
else
{
var ofs = nodetext.indexOf(inputky);
if(ofs != –1)
{
return true;
}
return false;
}
}
</script>
</head>

<body>
<div align="center">
<form name="f1">
<input type="text" size="40" name="ky">
<input type="button" name="sbutton" value="検索" onClick="Search(ky)">
</form>
<hr> <div id="hyouji" align="left"></div>
</div>
</body>
</html>




■ XML宣言をDOMツリーへ追加

var sen = hzn.createProcessingInstruction("xml", 'version="1.0"');
hzn.insertBefore(sen, hzn.childNodes.item(0));
hzn.appendChild(Rhzn);
var obXSL = new ActiveXObject('microsoft.XMLDOM');
obXSL.async = false;
obXSL.load("xslt09.xsl");
hyouji.innerHTML = hzn.transformNode(obXSL);


createProcessingInstruction」で作成したXML宣言を変数「sen」に格納し、 「insertBefore」によってDOMツリーの先頭へ追加しています。 「appendChild」で検索結果を追加し、以前にもやったように XSLTスタイルシートのオブジェクトを作成、XSLT文書を読み込みます。

sam09.htmlの実行結果は以下のように表示されます。

sam09HTMLファイルの表示結果


«««« back           next  »»»»
 
XMLとは
XML文書作成の大まかな流れ
XML文書の記述
XML文書ブラウザでの表示
XSLTスタイルシートの適用
XSLTの構造
XML文書の宣言
文字コードの設定
タグ付けのルール
要素名・属性の指定について
階層構造
実体参照・文字参照について
その他・コメントや処理
DTDの記述
名前空間の指定
情報をデータ化する
階層構造の作成
データからXML文書を作成する
会員情報の記述ルールを定義したDTD..
個々のXML文書を作成する
外部実体参照
テンプレートルール
XSLTスタイルシートを記述する 【ノード】
構造を変換する仕組み
テンプレートルールの定義
テンプレートの動作確認
XPathの仕組み  【XPathの関数】
XPathの表記方法
テキストの抽出  xsl:value-of
ノードのコピー  xsl:copy-of
テキストの生成  xsl:text
コメントの生成  xsl:comment
要素の生成  xsl:element
属性の生成  xsl:attribute
属性値の生成  【属性値テンプレート】
出力方法の指定  xsl:output
変数1  xsl:variable
変数2  xsl:param
変数3  xsl:with-param
繰り返し処理  xsl:for-each
再帰処理  xsl:if test
データの並べ替え  xsl:sort
データに番号をつけて出力  xsl:number
条件式に一致時のみ変換処理を実施 xsl:if
複数条件を設定して処理 xsl:choose
XSLTに別のXSLT.. xsl:import xsl:include
XSLT関数について
データを1件表示
データを決められた件数だけ表示
テキストと要素混在時のテキスト抽出法
データを全て表示する
表示するデータを並べ替える
条件式を設定して表示を変える
データを表にして表示する
複数件のデータを1つの表にして表示
リンクを加える  xsl:element xsl:attribute
データをCSV形式で出力する
DOM(Document Object Model)
DOMとjavascript
ノードにアクセスする
ノードにアクセスする 2
ノードにアクセスする 3
XSLTスタイルシートを読み込む
XSLTスタイルシートの切り替え
DOMとjavascriptで検索機能を作成する 1
DOMとjavascriptで検索機能を作成する 2
DOMとjavascriptで検索機能を作成する 3
DOMとjavascriptで検索機能を作成する (XSLTスタイルシート適用)
SVG(Scalable Vector Graphics)
SVG(Scalable Vector Graphics)の基本
「g」タグによるグループ化
図形の座標変換 transform属性
アニメーションを作成する animate要素
アニメーションを作成する animate要素2
イベント
DOMとJavaScriptを使用したイベント処理
XMLとXSLTからSVGを生成する
msxsl.exeのオプション
エラーメッセージの表示
LINK
XML(eXtensible Markup Language) バナーはダウ
ンロードして
お使い下さい。




Copyright © 2004 - ykr414 . All Rights Reserved.