尝试从XML文件中检索数据时,无法读取未定义的属性“childNodes”

时间:2015-12-25 14:05:34

标签: javascript ajax xml

鉴于此代码,

<style>
table,th,td {
  border : 1px solid black;
  border-collapse: collapse;
}
th,td {
  padding: 5px;
}
</style>
<body>


<form>
  <input type="text" id="word" value=""/>
  <button type="button" onclick="loadDoc()">Retrieve data</button>
  <br>

</form>

<br><br>
<table id="demo"></table>



<script type="text/javascript">// <![CDATA[
function loadDoc() {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (xhttp.readyState == 4 && xhttp.status == 200) {
      myFunction(xhttp);
    }
  };
  xhttp.open("GET", "URL" + $('#word').val(), true);
  xhttp.send();
}

function myFunction(xml) {
  var i;
  var xmlDoc = xml.responseXML;
  var table="<tr><th>Japanese</th><th>Pronunciation</th><th>English</th></tr>";
  var x = xmlDoc.getElementsByTagName("json");

  for (i = 0; i <x.length; i++) { 
    table += "<tr><td>" +
    x[i].getElementsByTagName("japanese")[0].childNodes[0].nodeValue +
    "</td><td>" +
    x[i].getElementsByTagName("pronunciation")[0].childNodes[0].nodeValue +
    "</td><td>" +
    x[i].getElementsByTagName("english")[0].childNodes[0].nodeValue +
    "</td>" + " " + "</tr>";
  }

  document.getElementById("demo").innerHTML = table;
}
// ]]></script>

如果没有值,我怎么能跳过“发音”标签?

更具体一点,我的XML文件有不同的标签 - “日语”(一个单词或汉字),“发音”(如何读取单词,在平假名中,只有当它是汉字时才有值)和“英语”(这个词的意思)。

当“发音”标签缺少值时,当前代码不起作用,这意味着没有发音的每个单词都会导致网站不显示任何内容。

XML文件:

<json> //This entry has pronunciation
<japanese>原爆</japanese>
<pos>n</pos>
<pronunciation>げんばく</pronunciation>
<english>(abbr) (See 原子爆弾) atomic bomb A-bomb</english>
</json>
<json> //This entry does not have pronunciation as it is not needed
<japanese>ダム</japanese>
<pos>n</pos>
<english>dam/(adj-f)</english>
<english>dumb</english>
</json>

谢谢!

1 个答案:

答案 0 :(得分:0)

从您的示例数据中,发音元素在不需要时完全省略。所以getElementsByTagName(&#34;发音&#34;)返回undefined,因此,你不能从中得到[0]。

您可以测试返回的内容并做出相应的响应,如下所示:

var pron = getElementsByTagName("pronunciation");
if (pron) { table += pron[0].childNodes[0].nodeValue; }

这假设您将一个长的作业拆分为&#39; table&#39;,分成不同的部分。通常,您可能会发现将其分解为如下函数很有用:

function getOptionalContentAsTD(ename) {
    var el = getElementsByTagName(ename);
    var txt = "";
    if (el) { txt = el[0].childNodes[0].nodeValue; }
    return("<td>" + txt + "</td>");
}

我没有对此进行测试,因此可能存在拼写错误,但它提出了这个想法。

希望有所帮助。