我正在尝试用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中的循环不是我的强项!任何帮助将不胜感激。
答案 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());
});
在此基础上,您的代码使用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);
}
或者,当然,使用firstChild
和nextSibling
:
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() );
});