0

phonegap で使用するために、javascript でいくつかの XML 結果を解析しようとしています。現状では、私の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 のループは私の得意分野ではありません。どんな助けでも大歓迎です。

4

2 に答える 2

2

ただし、現時点では、同じ応答を何度も警告しているだけです。

もちろん、0毎回同じインデックス ( ) を使用しています。

しかし、これのTL;DRバージョンは次のとおりです。すでにjQueryを使用しているので、jQueryを使用してください。代わりに使用して複雑なパーサー作成ロジックを置き換えるために使用できるだけで$.parseXMLなく、jQuery を使用してループを実行することもできます。ここでは、CompanyID要素をループしようとしていると仮定します。

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

実例| ソース


それに応じて、コードは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);
}

もちろん、代わりに and を使用firstChildnextSiblingます。

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

CompanyIDしかし、XML を見ると、ノードの子ノードではなく、ノードをループしたいと思われます。

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

しかし、繰り返しになりますが、既に使用しているライブラリをさらに活用することで、大幅に少ないコードでこれを行うことができます。:-)

于 2012-05-05T13:49:31.140 に答える
2

次のように jQuery でラップされているのプロパティparseXML()を使用することで、使用を避けることができます。XMLHttpRequestresponseXML

$.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() );
        });
    }
});
于 2012-05-05T14:41:36.647 に答える