使用Javascript解析XML(最终用于phonegap)

时间:2012-05-05 13:44:59

标签: javascript jquery xml ajax

我正在尝试用javascript解析一些XML结果以用于phonegap。现在我的xml布局是:

<Results>
     <Result>
          <FirstName>John</FirstName>
          <Surname>Beech</Surname>
          <Company>CompanyName</Company>
          <Job_Title>Property Department</Job_Title>
          <UserID>184</UserID>
          <CompanyID>CompanyID</CompanyID>
          </Result>
     <Result>
          <FirstName>Rosie</FirstName>
          <Surname>Beech</Surname>
          <Company>CompanyName</Company>
          <Job_Title>Job Title</Job_Title>
          <UserID>10494</UserID>
          <CompanyID>17322</CompanyID>
     </Result>
</Results>

我现在正在使用以下javascript警告响应,但最终我想创建一个响应表。

<script language="javascript" type="text/javascript">
    window.onload = function () {
        $.ajax({
            type: 'GET',
            url: 'Lookupbysurname.aspx?surname=beech',
            dataType: 'html',
            success: function (data) {


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

                for (var i = 0; i < xmlDoc.getElementsByTagName("CompanyID")[0].childNodes[0].length; i++) {
                    alert(xmlDoc.getElementsByTagName("CompanyID")[0].childNodes[0].nodeValue);
                }
            }
        });
    }
</script>

然而目前它只是一遍又一遍警告相同的反应。我把循环放错了吗? JS中的循环不是我的强项!任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

  

然而目前只是一遍又一遍警告相同的反应。

当然,每次都使用相同的索引(0)。

但TL; DR版本是:因为你已经在使用jQuery,所以只需使用jQuery。您不仅可以使用它来替换复杂的解析器创建逻辑,而是使用$.parseXML,但您也可以使用jQuery来执行循环。在这里,我假设你试图循环CompanyID元素:

var xmlDoc = $.parseXML(data);
var $xml = $(xmlDoc);
$xml.find("CompanyID").each(function() {
    alert($(this).text());
});

Live example | source


在此基础上,您的代码使用0而不是i

for (var i = 0; i < xmlDoc.getElementsByTagName("CompanyID")[0].childNodes[0].length; i++) {
    // This is always 0 -----------------------------------------v 
    alert(xmlDoc.getElementsByTagName("CompanyID")[0].childNodes[0].nodeValue);
}

如果要循环子节点,则要使用i,而不是0


但是这个循环非常效率低下,因为你每次都要回去重复查找。代替:

var nodes = xmlDoc.getElementsByTagName("CompanyID")[0].childNodes;
for (var i = 0; i < nodes.length; i++) {
    alert(nodes[i].nodeValue);
}

或者,当然,使用firstChildnextSibling

var node;
for (node = xmlDoc.getElementsByTagName("CompanyID")[0].firstChild;
     node;
     node = node.nextSibling) {
    alert(node.nodeValue);
}

但是看看你的XML,我怀疑你想要遍历CompanyID个节点,而不是它们的子节点:

var node;
for (node = xmlDoc.getElementsByTagName("CompanyID");
     node;
     node = node.nextSibling) {
    alert(node.firstChild.nodeValue);
}

但同样,通过更多地使用您已经使用的库,您可以使用极少的代码来完成此操作。 : - )

答案 1 :(得分:2)

您可以使用parseXML()的{​​{1}}属性来避免使用XMLHttpRequest,该属性包含在jQuery中,如下所示:

responseXML

由于您已经在使用jQuery,因此可以使用jQuery遍历XML:

$.ajax({
    type: 'GET',
    url: 'Lookupbysurname.aspx?surname=beech',
    dataType: 'xml',
    success: function(xmlDoc) {
        alert(xmlDoc.getElementsByTagName("CompanyID")[0].nodeValue);
    }
});

完整代码:

var $xml = $(xmlDoc);
$xml.find("CompanyID").each(function() {
    alert( $(this).text() );
});