【发布时间】:2012-09-09 07:00:09
【问题描述】:
提前感谢您的帮助!
我是 javascript 的新手,但我在 java 方面有相当深厚的背景,所以我想我会在我正在从事的这个项目上尝试一下。
本质上,我要做的是从 xml 文件中读取数据并为我正在制作的页面创建 html 代码。我使用了来自 w3schools 的脚本 here。我已经对其进行了修改并让它从我自己的 xml 中提取数据,甚至可以生成我需要的更基本的 html 代码。
这是我用于所有测试/构建的页面:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>xml test table</title>
<script>
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET","SWPlanetData.xml",false);
xmlhttp.send();
swDoc=xmlhttp.responseXML;
var s=swDoc.getElementsByTagName("planet");
</script>
</head>
<body>
<div class="planets-info-container">
<script>
for (i=0;i<s.length;i++)
{
var plName
= s[i].getElementsByTagName("planetName")[0].childNodes[0].nodeValue;
var plDesc
= s[i].getElementsByTagName("description")[0].childNodes[0].nodeValue;
var plUrl
= s[i].getElementsByTagName("linkUrl")[0].childNodes[0].nodeValue;
var plUrlTxt
= s[i].getElementsByTagName("linkText")[0].childNodes[0].nodeValue;
var plShowsList
= s[i].getElementsByTagName("show");
var plGamesList
= s[i].getElementsByTagName("videoGame");
// test section
var test = ''
test += '<div><table border = "1">\n' +
'<tr><td>' + s[i].getElementsByTagName("showText")[0].childNodes[0].nodeValue
+ '</td><td>' + s[i].getElementsByTagName("showUrl")[0].childNodes[0].nodeValue + '</td></tr>'
+ '<tr><td>' + s[i].getElementsByTagName("gameText")[0].childNodes[0].nodeValue + '</td><td>'
+ s[i].getElementsByTagName("gameUrl")[0].childNodes[0].nodeValue + '</td></tr>'
+ '</tr></table></div>'
document.write(test);
document.close();
// end section
document.write("<div class=\"planet-info-container\" id=\""+plName+"-container\">");
document.write("<div class=\"name-row\"><div class=\"planet-name\">"+plName+"</div></div>");
document.write("<div class=\"desc-row\">");
document.write("<div class=\"planet-desc\">"+plDesc+"</div>");
document.write("</div>");
document.write("<div class=\"appearances-row\"><ol class=\"shows\"><li>shows list</li>");
for(j=0;j<plShows.length;j++){
document.write("nested for");
var showUrl = s[i].getElementsByTagName("showUrl")[j].childNodes[0].nodeValue;
var showText = s[i].getElementByTagName("showText")[j].childNodes[0].nodeValue;
document.write("<li><a href=\""+showUrl+"\">"+showText+"</a></li>");
}
document.write("</ol><ol class=\"games\"> games list");
for(j=0;j<s[i].getElementByTagName("videoGame").length;j++){
var gameUrl = s[i].getElementsByTagName("gameUrl")[j].childNodes[0].nodeValue;
var gameText = s[i].getElementByTagName("gameText")[j].childNodes[0].nodeValue;
document.write("<li><a href=\""+gameUrl+"\">"+gameText+"</a></li>");
}
document.write("</ol></div>");
document.write("<div class=\"locs-row\">");
document.write("</div>");
document.write("<div class=\"races-row\">");
document.write("</div>");
document.write("<div class=\"chars-row\">");
document.write("</div>");
document.write("<div class=\"links-row\">");
document.write("<div class=\""+plName+"-link\"><a href=\""+plUrl+"\">"+plUrlTxt+"</a></div>");
document.write("</div>");
document.write("</div><br />");
}
</script>
</div>
</body>
代码在最后的嵌套 for 循环处中断,它完成了 document.write 并将“显示列表”打印到页面,但随后再也没有到达 document.write 内部。
如果有帮助,xml 包含来自星球大战宇宙的行星列表,其组织方式如下:
<planets>
<planet>
<planetName>planet</planetName>
<description>some text</description>
<appearances>
<show>
<showUrl>url</showUrl>
<showText>hyperlink text</showText>
</show>
<videoGame>
<gameUrl>url</gameUrl>
<gameText>hyperlink text</gameText>
</videoGame>
</appearances>
<locationsOfInterest>
<location>location name</location>
</locationsOfInterest>
<famousCharactersRelatedTo>
<character>a character</character>
</famousCharactersRelatedTo>
<externalLinks>
<link>
<linkUrl>url</linkUrl>
<linkText>hyperlink text</linkText>
</link>
</externalLinks>
</planet>
编辑:我试图减少代码以减少混乱,使这变得比原来更难,但我遗漏了一些重要的东西/我输入的内容有误,所以我用整个代码替换了我之前的代码页面原样。
再次编辑:我已经取得了一些进展,但我仍然遇到嵌套循环的问题。它将进入第一个,但在设置第二个变量的第一次迭代之前中断:
var showText = s[i].getElementsByTagName("showText")[j].childNodes[0].nodeValue;
谁能明白为什么这会坏?
【问题讨论】:
-
上面写着
j<plShows.length的意思是j<plShowsArr.length吗? -
var plShowsArr = s[i].getElementsByTagName("show");我从哪里来 -
那么下面的循环又使用了 i 吗?
-
话虽如此:mcdwight6 需要使用提到的修复无关紧要,并从 Marcus 提到的行中删除
[i],并从后面的行中删除[i]。 -
控制台中有什么东西吗?可能不相关,但 w3fools.com - 不建议在循环中使用 document.write。而是附加到字符串并改用 innerHTML。如果你在页面渲染后调用你的函数,那么将会用 document.write 破坏页面
标签: javascript html xml for-loop xmlhttprequest