2

次の 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 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>

これは正常に機能していますが、XML ファイル内の値の 1 つに次のような値がない場合<from></from>、残りの値はデータを返しません。

ノードに値がなくても、これを検出して先に進む方法はありますか?

4

3 に答える 3

1

これらのいずれにも存在しない場合、それ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 : "";
于 2012-05-25T01:45:20.993 に答える
0

それを検出するだけです:

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;
}
于 2012-05-25T01:47:48.463 に答える
0

これは、タグに値がない場合、子ノード、特にテキスト ノードがないためです。これchildNodeは何も含まず、childNode[0]ですundefined。のプロパティを取得しようとするとundefined、エラーが発生します。

//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;

これはブランクを使用したサンプルです<span>

于 2012-05-25T01:45:54.237 に答える