Javascript 缺少XML节点
我有以下XML文件:Javascript 缺少XML节点,javascript,html,xml,Javascript,Html,Xml,我有以下XML文件: <?xml version="1.0" encoding="ISO-8859-1" ?> <!-- Edited by XMLSpy® --> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me t
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!-- Edited by XMLSpy® -->
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
托弗
贾尼
提醒
这个周末别忘了我!
并使用以下Javascript/HTML:
<html>
<body>
<h1>W3Schools Internal Note</h1>
<div>
<b>To:</b>
<span id="to"></span>
<br />
<b>From:</b>
<span id="from"></span>
<br />
<b>Message:</b>
<span id="message"></span>
</div>
<script type="text/javascript">
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", "note.xml", false);
xmlhttp.send();
xmlDoc = xmlhttp.responseXML;
document.getElementById("to").innerHTML = xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue;
document.getElementById("from").innerHTML = xmlDoc.getElementsByTagName("from")[0].childNodes[0].nodeValue;
document.getElementById("message").innerHTML = xmlDoc.getElementsByTagName("body")[0].childNodes[0].nodeValue;
</script>
</body>
</html>
学校内部说明
致:
发件人:
信息:
if(window.XMLHttpRequest){//IE7+、Firefox、Chrome、Opera、Safari的代码
xmlhttp=新的XMLHttpRequest();
}else{//IE6、IE5的代码
xmlhttp=新的ActiveXObject(“Microsoft.xmlhttp”);
}
open(“GET”,“note.xml”,false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
document.getElementById(“to”).innerHTML=xmlDoc.getElementsByTagName(“to”)[0]。childNodes[0]。nodeValue;
document.getElementById(“from”).innerHTML=xmlDoc.getElementsByTagName(“from”)[0]。childNodes[0]。nodeValue;
document.getElementById(“消息”).innerHTML=xmlDoc.getElementsByTagName(“正文”)[0]。childNodes[0]。nodeValue;
这很好,但是如果XML文件中的一个值没有值,例如
,那么其余的值将不会返回任何数据
如果这些节点上都不存在
childNodes[0]
,则在尝试调用nodeValue
时会出现错误。首先测试它是否存在:
// Get and store the nodes from the xml first
var toNode = xmlDoc.getElementsByTagName("to")[0];
var fromNode = xmlDoc.getElementsByTagName("from")[0];
var messageNode = xmlDoc.getElementsByTagName("message")[0];
// And only assign them if they actually have childNodes. Otherwise use an empty string
document.getElementById("to").innerHTML = toNode.childNodes.length ? toNode.childNodes[0].nodeValue : "";
document.getElementById("from").innerHTML = fromNode.childNodes.length ? fromNode.childNodes[0].nodeValue : "";
document.getElementById("message").innerHTML = messageNode.childNodes.length ? messageNode.childNodes[0].nodeValue : "";
这是因为当标记没有值时,它没有子节点,特别是文本节点。这使得
childNode
不包含任何内容,childNode[0]
是未定义的
。如果尝试获取未定义的属性,它将遇到错误:
//gets the from
xmlDoc.getElementsByTagName("from")[0]
//this is undefined since there is no childNode
xmlDoc.getElementsByTagName("from")[0].childNodes[0]
//getting a property of undefined will cause an error and kill execution
xmlDoc.getElementsByTagName("from")[0].childNodes[0].nodeValue;
使用空白的
只需检测它:
var map = {to:"to", from:"from", message:"body"};
for (var id in map) {
var node = xmlDoc.getElementsByTagName(map[id]])[0]; // worst case: accesses first node of empty NodeList
if (node && node.childNodes.length) // >0
document.getElementById(id).innerText = node.childNodes[0].nodeValue;
}
当其中一个为空时,脚本是否出错,导致后续语句无法执行?打开浏览器的错误控制台。