0

以下の JavaScript コードでは、最初のループでは機能しますが、2 番目のループでは常に y.length が 0 に等しく、ループに入ることはありません。y.length がゼロではありません。私の xml ファイルには私のものがたくさんあります。デバッグを試みましたが、それ以上進むことができませんでした。どんな助けでも大歓迎です。

function myXML(myText, myTarget) {
    try {
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";
        xmlDoc.loadXML(myText);
    } catch (e) {
        try {
            parser = new DOMParser();
            xmlDoc = parser.parseFromString(myText, "text/xml");
        } catch (e) {
            alert(e.message);
            return;
        }
    }
    var x = xmlDoc.getElementsByTagName("myThing");
    for (var i = 0; i < x.length; i++) {
        if (x[i].getElementsByTagName("firstItem")[0].hasChildNodes) {
            document.getElementById(target).innerHTML = document.getElementById(myTarget).innerHTML + x[i].getElementsByTagName("secondThing")[0].childNodes[0].nodeValue + " - " + x[i].getElementsByTagName("firstItem")[0].childNodes[0].nodeValue + "<br>";
            var response = "";
            var sid = x[i].getElementsByTagName("id")[0].childNodes[0].nodeValue;
            $.ajax({
                type: "GET",
                url: "../sitman/requests/get_affected_nodes.cgi?sid=" + sid,
                async: false,
                success: function(text) {
                    response = text;
                }
            });
            try {
                xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
                xmlDoc.async = "false";
                xmlDoc.loadXML(response);
            } catch (e) {
                try {
                    parser = new DOMParser();
                    xmlDoc = parser.parseFromString(response, "text/xml");
                } catch (e) {
                    alert(e.message);
                    return;
                }
            }
            var y = xmlDoc.getElementsByTagName("myThing");
            for (var j = 0; j < y.length; j++) {
                document.getElementById(myTarget).innerHTML = document.getElementById(myTarget).innerHTML + y[j].getElementsByTagName("myname")[0].childNodes[0].nodeValue + "<br>";
            }
        }
    }
}

y の XML は次のとおりです。

<xml>
<entries>
<myThing>
<myName>xxx</myName>
<test1>test8</test1>
<test2>test6</test2>
</myThing>
<myThing>
<myName>xxx</myName>
<test1>test2</test1>
<test2>test3</test2>
</myThing>
</entries>
</xml>
4

1 に答える 1

1

コードにいくつかの問題があることに気づきました。まず、次の行でundefine 変数ターゲットにアクセスしています。

document.getElementById(target).innerHTML = document.getElementById(myTarget).innerHTML + x[i].getElementsByTagName("secondThing")[0].childNodes[0].nodeValue + " - " + x[i].getElementsByTagName("firstItem")[0].childNodes[0].nodeValue + "<br>";

そのターゲットはmyTargetだったはずです。

次に、これで ajax 応答を解析しています。

try {
    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async = "false";
    xmlDoc.loadXML(response);
} catch (e) {
    try {
        parser = new DOMParser();
        xmlDoc = parser.parseFromString(response, "text/xml");
    } catch (e) {
        alert(e.message);
        return;
    }
}

しかし、応答はすでに XML オブジェクトです。そのセクション全体を次のように置き換えることができます。

xmlDoc = response;

最後に、y に対する最後の for ループでは、次の呼び出しが行われます。

y[j].getElementsByTagName("myname")

しかし、XML では、要素の名前は実際にはmyName.

これらすべてを修正したテストサーバーを作成しましたが、問題なく動作しているように見えたので、修正する必要があるのはそれだけだと思います。

于 2013-07-01T17:24:56.347 に答える