2015-12-25 2 views
0

Учитывая этот код,Не удается прочитать свойство «ChildNodes» неопределенных при попытке извлечь данные из файла 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-файл имеет разные теги - «japanese» (слово или кандзи), «произношение» (как слово читается в хирагане и имеет значение только тогда, когда это кандзи) и «английский» (значение слова).

Текущий код не работает, если для тега «произношение» отсутствует значение, что означает, что каждое слово без произношения приведет к тому, что на сайте не будет отображаться ничего.

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> 

Спасибо!

ответ

0

Из ваших данных образца элемент произношения полностью опускается, когда он не нужен. Таким образом, getElementsByTagName («произношение») возвращается неопределенным, и из-за этого вы не можете получить [0] из него.

Вы можете проверить, что возвращается и реагировать соответствующим образом, как это:

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

Это предполагает, что вы разделить одну длинную задание «таблицы», на отдельные части. В общем, может оказаться полезным фактором на это в функцию, как:

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

Я не проверял это, так что, вероятно, опечатка, но это дает идею.

Надеюсь, что это поможет.

+0

Ах, woah. Я не заметил, что тег был полностью опущен! Во всяком случае, я очень много нового в Javascript, поэтому, даже если я понимаю, что делает ваш код, я не могу понять, как его адаптировать, чтобы он работал. Я обновил сообщение, чтобы включить также код HTML и запрос XMLHttp. Спасибо за вашу помощь! – Sara

+0

** Обновление **: Я понял, как решить свою проблему. Бесконечно благодарен! – Sara

Смежные вопросы