【问题标题】:Parsing XML with Javascript (for eventual use in phonegap)使用 Javascript 解析 XML(最终在 phonegap 中使用)
【发布时间】:2012-05-06 01:07:23
【问题描述】:

我正在尝试在 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 中的循环不是我的强项!任何帮助将不胜感激。

【问题讨论】:

  • FWIW,由于您已经在使用 jQuery,您可以简化 XML 解析逻辑,只需使用 $.parseXML

标签: javascript jquery xml ajax


【解决方案1】:

您可以通过使用XMLHttpRequestresponseXML 属性来避免使用parseXML(),该属性封装在jQuery 中,如下所示:

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

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

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

完整代码:

$.ajax({
    type: 'GET',
    url: 'Lookupbysurname.aspx?surname=beech',
    dataType: 'xml',
    success: function(xmlDoc) {
        var $xml = $(xmlDoc);
        $xml.find('CompanyID').each(function() {
            alert( $(this).text() );
        });
    }
});

【讨论】:

  • 谢谢你,xmlDoc在哪里定义?我收到一个错误,即未定义 xmlDoc 并且 xmlDoc.getElementsByTagName 不是函数 - Tom
  • 对不起 - 很特别,修复了未定义的 xmlDoc,但 getElementsByTagName 仍然不起作用 - paste.tiag.me/22 Tom
  • @TomBeech:对不起,我的意思是您需要将第二个代码块放在success 方法中。我会更新我的答案。
【解决方案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);
}

但同样,您可以通过更多地使用您已经在使用的库来显着减少代码量。 :-)

【讨论】:

  • 您还应该使用nodes[i] 而不是nodes[0](倒数第二个框)
  • 非常感谢!它会跨域工作吗? Js 将在手机本地,XML 在远程服务器上
  • @TomBeech:XML 部分与域无关;我们在data 中有XML 文本的地方已经找到了。 (实际上,您甚至可能不需要 parseXML 调用;如果服务器返回正确的 MIME 类型,jQuery 会在将其提供给回调之前为您解析它。)您需要担心的是 ajax 调用。根据this question 和一些谷歌搜索,我的印象是通常你很好,但我自己没有使用过 PhoneGap。
猜你喜欢
  • 2012-06-21
  • 2023-03-10
  • 1970-01-01
  • 2016-08-15
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
相关资源
最近更新 更多