【问题标题】:Unable to parse XML dynamically无法动态解析 XML
【发布时间】:2013-06-28 20:24:23
【问题描述】:

在下面的 JavaScript 代码中,它适用于第一个循环,但对于第二个循环,它始终显示 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>

【问题讨论】:

  • y 等于 0???你的意思是y.length == 0
  • 只使用dataType: "xml",不要启动自己的DOMParser? (顺便说一句,ActiveX 应该是标准 DOMParser 的后备,而不是相反)
  • 是的,我的意思是 y.length。我会纠正它,但仍然无法正常工作。
  • console.log(xmlDoc) 向您展示了什么,可能是解析错误?
  • 是的,它显示解析器错误。文档为空。

标签: javascript xml dom xml-parsing


【解决方案1】:

注意到您的代码中有几个问题。首先,您在这一行中访问了一个未定义的变量 target

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

假设 target 应该是 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

我已经创建了一个测试服务器并修复了所有这些问题,它对我来说似乎工作正常,所以我认为这就是你需要修复的全部内容。

【讨论】:

  • 谢谢 james target 和 myname 是错字,我把这些东西都写对了,但是在我用 xmlDoc = response; 替换 try catch 之后它只是没有寻找我将尝试找出的所有x。还是谢谢你。
猜你喜欢
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 2014-09-05
  • 2022-04-04
  • 1970-01-01
相关资源
最近更新 更多