- PR -

住所で検索したいのですが・・・

1
投稿者投稿内容
諒香ママ
会議室デビュー日: 2002/05/22
投稿数: 3
投稿日時: 2002-05-22 16:09
こんにちは、
XMLをはじめて1ヶ月のわかばまーくです。
よろしくお願いいたします。

「Ask XML Expert > 顧客管理をXMLで行う方法を教えて」で
顧客の名前でデータを検索していますが
これを住所や性別で検索したいと思っています。

HTMLの中のJSを変更すればよいのかと思っていろいろ試しているのですが
まだまだ未熟者でうまくいきません。

どなたか御教授お願いいたします。

諒香ママ
会議室デビュー日: 2002/05/22
投稿数: 3
投稿日時: 2002-05-22 19:19
変更したいJSを載せていませんでした。すいません。(汗)
といっても、そのままのコピペですが・・

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>顧客情報検索</TITLE>
<SCRIPT language="JavaScript" FOR="window" EVENT="onload">
<!--
 // このファイルが読込まれたときの処理
 // 再表示用のデータがある場合ブラウザに出力
 if (document.hdata.HideData.value != "") {
  res.innerHTML = document.hdata.HideData.value
 }
 else {
  res.innerHTML = ""
 }
//-->
</SCRIPT>
<SCRIPT language="JavaScript">
<!--
// 顧客情報からの検索処理
function SearchDsp(cName) {
 // 再表示用データ格納領域クリア
 document.hdata.HideData.value = ""
 res.innerHTML = ""

 // ワーク用の XML ドキュメントオブジェクト
 var objDocWk = new ActiveXObject("Microsoft.XMLDOM")
 // 出力用の新しいルートノードを作成
 dstNd = objDocWk.createNode(1, "clientlist", "")

 // XML ドキュメントオブジェクト生成
 var objDoc = new ActiveXObject("Microsoft.XMLDOM")
 objDoc.async = false
 // 顧客情報の読込み
 objDoc.load("person.xml")
 // 顧客情報のルートノードを取得
 var objRootNode = objDoc.documentElement.childNodes

 // 子ノードが無くなるまで繰返し
 for (Loop4 = 0;Loop4 <= objRootNode.length-1; Loop4++) {
  // ルーとノードの子ノードを取得
  objNode = objRootNode.item(Loop4)
  // 要素名をチェック
  if (objNode.baseName === "person") {
   // person 要素なら比較対象(氏名)のノードを取得
   objName = objNode.childNodes.item(0)
   // 氏名に検索文字列が含まれているかをチェック
   if (cName.value != "" && CompStr(objName.text, cName.value) == 1) {
    // 検索文字列が含まれていた場合、person ノードをコピー
    cpNd = objNode.cloneNode(true)
    // コピーした person ノードを出力用の XML ドキュメントに追加
    dstNd.appendChild(cpNd)
   }
  }
 }

 // XML 宣言を作成
 pi = objDocWk.createProcessingInstruction("xml", " version=" + '"' + "1.0" + '"')
 // XML 宣言を追加
 objDocWk.insertBefore(pi, objDocWk.childNodes.item(0))
 // スタイルシート宣言を作成
 pi = objDocWk.createProcessingInstruction("xml-stylesheet", " type=" + '"' + "text/xsl" + '"')
 // スタイルシート宣言を追加
 objDocWk.insertBefore(pi, objDocWk.childNodes.item(1))
 // 検索結果のデータをセット
 objDocWk.appendChild(dstNd)

 // XSL ファイルの読込みオブジェクトを作成
 var objXSL = new ActiveXObject("Microsoft.XMLDOM");
 objXSL.async = false;
 // XSL ファイルを読込み
 objXSL.load("person.xsl");

 // スタイル付けをして表示
 document.hdata.HideData.value = objDocWk.transformNode(objXSL);
 // 表示データをブラウザに出力
 res.innerHTML = document.hdata.HideData.value
}

// 比較処理
function CompStr(srcStr, cmpStr) {

 // 半角英字をすべて大文字に変換
 var str1 = srcStr.toUpperCase()
 var str2 = cmpStr.toUpperCase()
 // 比較元と比較先が同じなら1を返す
 if (str1 == str2) {
  return 1
 }
 else {
  // 比較対象文字列に比較文字列が含まれているかチェック
  var offset = str1.indexOf(str2)
  if (offset == -1) {
   return -1
  }
  return 1
 }
}
//-->
</SCRIPT>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
 <!-- 検索結果を保存するフィールド -->
 <!-- 検索結果を保存して再表示の度に検索処理を行わないようにする -->
 <FORM name="hdata">
  <INPUT size="20" type="hidden" name="HideData" value="">
 </FORM>
 <B><FONT size="+3" color="#0000cc">顧客情報検索</FONT></B>
 <BR/>
 <BR/>
 <B><FONT size="+1" color="#008800">検索</FONT></B>
 <BR/>
 <!-- 検索フォーム -->
 <FORM name="SearchData">
  <!-- 検索文字列の入力フィールド -->
  <B><FONT size="+1">氏名 : </FONT></B><INPUT size="30" type="text" name="cname"><BR/><BR/>
  <!-- 検索ボタン -->
  <INPUT type="button" name="searchdsp" value="検 索"; onclick="SearchDsp(cname)">
 </FORM>
 <hr/>
 <!-- 検索結果を表示する場所 -->
 <DIV id="res"></DIV>
</BODY>
</HTML>
FE
会議室デビュー日: 2002/05/24
投稿数: 9
投稿日時: 2002-05-24 14:59
(「そのままコピペ」されていますが、オリジナルバグ(";"抜けとか)はつぶしてちゃんと動作させていることを前提とします)
とりあえず名前の代わりに住所で検索したい場合、

コード:
〜省略
  // person 要素なら比較対象(氏名)のノードを取得
  /* objName = objNode.childNodes.item(0); */
  /* とりあえずaddressは1個しかないと仮定して */
  if ((objName = objNode.getElementsByTagName("address").item(0)) != null) {

    if (cName.value != "" && CompStr(objName.text, cName.value) == 1) {
      cpNd = objNode.cloneNode(true);
      dstNd.appendChild(cpNd);
    }

  }

  // XML 宣言を作成
省略〜



こんな感じになるんじゃないでしょうか。
私だったらXSLTで検索してしまいますが。
XSLで<xsl:param name="addr"></xsl:param>とか宣言しておいて、例えば
<xsl:for-each select="person">

<xsl:for-each select="person[contains(./address,$addr)]">
にするとか、あるいはfor-eachループの中で<xsl:if>で判定するとか。
DOMでコーディングするより楽です。(XSLTにパラメータを渡す部分は書かなきゃいけませんが^^;)
諒香ママ
会議室デビュー日: 2002/05/22
投稿数: 3
投稿日時: 2002-05-28 16:20
FlossenEngelさん
回答ありがとうございます。
お返事が遅れて申し訳ありません。

早速試してみます!
XMLで検索する方法も教えていただいてありがとうございます!
こちらの方も早速ためしてみます。

ありがとうございました!
1

スキルアップ/キャリアアップ(JOB@IT)