2013-06-10 12 views
6

私のコースでは、ユーザーが連絡先のファーストネームを入力できるようにするHTMLページを作成するように求められています。ユーザが入力したファーストネームと一致するまで連絡先をループし、メールアドレス以外の連絡先情報を同じページに表題の表と<h1>の表に表示します。連絡先の詳細は次のとおりです。一致するものがない場合は、連絡先が存在しないことを示す<h2>があるはずです。JavaScriptでXMLを検索してテーブルに結果を表示

次は私のXMLファイルです:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<?xml-stylesheet type="text/xsl" href="Contact.xsl" ?> 
<!DOCTYPE contact SYSTEM "contact.dtd"> 
<contact> 
    <person> 
     <name> 
      <firstname>Bob</firstname> 
      <lastname>Jones</lastname> 
     </name> 
     <phone>(02)44 42 45 63</phone> 
     <address> 
      <street>34 Highway Road</street> 
      <city>Grovedale</city> 
      <state>NSW</state> 
      <postcode>3228</postcode> 
      <email>[email protected]</email> 
     </address> 
    </person> 
    <person> 
     <name> 
      <firstname>Gary</firstname> 
      <lastname>Williams</lastname> 
     </name> 
     <phone>(02)44 41 87 56</phone> 
     <address> 
      <street>223 Yarra Avenue</street> 
      <city>Branston</city> 
      <state>NSW</state> 
      <postcode>2317</postcode> 
      <email>[email protected]</email> 
     </address> 
    </person> 

私はいくつかのことを試してみましたが、私は、データがテーブルに表示するために得るだろうか見当がつかない。以下は私のXSLファイルで、テーブルを表示したいと思う方法ですが、検索の結果は表示されます。

<?xml version="1.0" encoding="ISO-8859-1"?><!-- DWXMLSource="Contact.xml" --> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
<html> 
<head> 
<style> 
body { 
    font-family: Arial, Helvetica, sans-serif; 
    font-size: 14px; 
} 
div { 
    margin-left: 150px; 
    margin-right: 20px; 
    margin-top: 50px; 
    width: 80%; 
} 
h1 { 
    font-size: 24px; 
    color: #F00; 
} 
.headings { 
    background-color: #06F; 
} 
.data { 
    background-color: #6F9; 
} 
.table { 
    border: 2px solid #F00; 
    width: 100%; 
} 
</style> 
</head> 
<body> 
<div> 
<h1>CONTACTS</h1> 
    <table class="table"> 
     <tr class="headings"> 
      <th>First Name</th> 
      <th>Last Name</th> 
      <th>Street</th> 
      <th>City</th> 
      <th>State</th> 
      <th>Postcode</th> 
      <th>Email</th> 
     </tr> 
     <xsl:for-each select="contact/person"> 
     <tr class="data"> 
      <td><xsl:value-of select="name/firstname"/></td> 
      <td><xsl:value-of select="name/lastname"/></td> 
      <td><xsl:value-of select="address/street"/></td> 
      <td><xsl:value-of select="address/city"/></td> 
      <td><xsl:value-of select="address/state"/></td> 
      <td><xsl:value-of select="address/postcode"/></td> 
      <td><xsl:value-of select="address/email"/></td> 
     </tr> 
    </xsl:for-each> 
</table> 
</div> 
</body> 
</html> 
</xsl:template> 
</xsl:stylesheet> 

JavaScriptを使用してXMLファイルを検索し、検索結果を表示する表を作成する必要があります。

次のように私が持っているHTMLは次のとおりです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Task 2</title> 
<script language="JavaScript" type="text/javascript"> 
window.onload = loadIndex; 
function loadIndex() 
{ 
    if (document.implementation && document.implementation.createDocument) 
    { 
     xmlDoc = document.implementation.createDocument("", "", null); 
     xmlDoc.load("Contact.xml"); 
    } 
    else if (window.ActiveXObject) 
    { 
     xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); 
     xmlDoc.async = "false"; 
     xmlDoc.load("Contact.xml"); 
    } 
} 
function searchIndex() 
{ 
    if (!xmlDoc) 
    { 
     loadIndex(); 
    } 
    var searchterm = document.getElementById("searchme").value; 
    var allitems = xmlDoc.getElementsByTagName("firstname"); 
    results = new Array; 
    for (var i=0;i<allitems.length;i++) 
    { 
     var name = allitems[i].lastChild.nodeValue; 
     var exp = new RegExp(searchterm,"i"); 
     if (name.match(exp) != null) 
     { 
      results.push(allitems[i]); 
     } 
    } 
    showResults(results, searchterm); 
} 
function showResults(results, searchterm) 
{ 
    //insert table data here to be displayed 
} 
</script> 
</head> 
<body> 
First Name: <input type="text" name="firstname" id="searchme"> 
<br /> 
<input type="submit" value="Search" onClick="searchIndex(); return false;"> 
</body> 
</html> 

あなたが見ることができるように、私はどこから始めれば見当がつかない。私はXMLファイルをロードし、ファーストネームタグを収集し、次に何とか2つを比較して結果を表示することを知っています。

私は以下を見てきました。これは私の後ろに似ていますが、結果を表に表示することはできません。 http://www.dzone.com/snippets/simple-javascriptxml-based

ありがとうございました。

+0

ここで、関数searchIndexはですか? –

+0

今はどこもありません。私が言ったように。どこから始めたらいいのか分かりません。私が思う以上に上記を編集してください。 – Curley5959

+0

コードを更新しました。 – Curley5959

答えて

1

以下は私が問題を解決するために使用したものです。私が持っていた1つの問題は、これをローカルでテストすることでした。うまくいかないだろう。連絡先が見つからない場合は、これもメッセージが保留されます。私は解決策を見つけると更新されます。

更新:解決策が見つかりました。私は、これは他の誰かを助けることを願って

<body> 
First Name: <input type="text" name="firstname" id="input"> 
<br /> 
<input type="submit" value="Submit" onClick="searchXML()"> 
<br /> 
<br /> 
<div id="results"> 
</div> 
</body> 

<script language="JavaScript" type="text/javascript"> 
function loadXMLDoc(dname) 
{ 
    if (window.XMLHttpRequest) 
    { 
     xhttp=new XMLHttpRequest(); 
    } 
    else 
    { 
     xhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xhttp.open("GET",dname,false); 
    xhttp.send(); 
    return xhttp.responseXML; 
} 
function searchXML() 
{ 
    xmlDoc=loadXMLDoc("Contact.xml"); 
    x=xmlDoc.getElementsByTagName("firstname"); 
    input = document.getElementById("input").value; 
    size = input.length; 
    if (input == null || input == "") 
    { 
     document.getElementById("results").innerHTML= "Please enter a character or name!"; 
     return false; 
    } 
    for (i=0;i<x.length;i++) 
    { 
     startString = firstname.substring(0,size); 
     if (startString.toLowerCase() == input.toLowerCase()) 
     { 
      firstname=xmlDoc.getElementsByTagName("firstname")[i].childNodes[0].nodeValue; 
      lastname=xmlDoc.getElementsByTagName("lastname")[i].childNodes[0].nodeValue; 
      phone=xmlDoc.getElementsByTagName("phone")[i].childNodes[0].nodeValue; 
      street=xmlDoc.getElementsByTagName("street")[i].childNodes[0].nodeValue; 
      city=xmlDoc.getElementsByTagName("city")[i].childNodes[0].nodeValue; 
      state=xmlDoc.getElementsByTagName("state")[i].childNodes[0].nodeValue; 
      postcode=xmlDoc.getElementsByTagName("postcode")[i].childNodes[0].nodeValue; 
      divText = "<h1>The contact details are:</h1><br /><table border=1><tr><th>First Name</th><th>Last Name</th><th>Phone</th><th>Street</th><th>City</th><th>State</th><th>Postcode</th></tr>" + "<tr><td>" + firstname + "</td><td>" + lastname + "</td><td>" + phone + "</td><td>" + street + "</td><td>" + city + "</td><td>" + state + "</td><td>" + postcode + "</td></tr>" + "</table>"; 
      break; 
     } 
     else 
     { 
      divText = "<h2>The contact does not exist.</h2>"; 
     } 
    } 
    document.getElementById("results").innerHTML= divText; 
} 
</script> 

私のhtml体を:以下、更新されたコードを参照してください。ここで

0
startString = firstname.substring(0,size); 

firstnameは、エラーの下に与える理由です、forループの前には場所を定義されていません。

Uncaught TypeError: Cannot read property 'substring' of undefined.

0

このように、startStringの前に変数として参照されたファーストネーム。

firstname = xmlDoc.getElementsByTagName("firstname")[i].childNodes[0].nodeValue; 
startString = firstname.substring(0,size); 

これは素晴らしい結果でした。希望が助けてくれる!

関連する問題