如何用JavaScript验证和遍历XML.真的没有更好的办法了

How to verify and traverse XML with JavaScript. Really no better way?

本文关键字:更好 真的 JavaScript 何用 验证 XML 遍历      更新时间:2023-09-26

我正在做一个简单的jQuery.get调用api.facebook.com来检索一个URL的喜欢的数量。结果是XML(这本身是出乎意料的,但不是这里的重点)。响应如下所示:

<links_getStats_response xmlns=​"http:​/​/​api.facebook.com/​1.0/​" xmlns:xsi=​"http:​/​/​www.w3.org/​2001/​XMLSchema-instance" xsi:schemaLocation=​"http:​/​/​api.facebook.com/​1.0/​ http:​/​/​api.facebook.com/​1.0/​facebook.xsd" list=​"true">​
  <link_stat>​
    <url>​godfisk.no/fiskenasjonen​</url>​
    <normalized_url>​http://www.godfisk.no/fiskenasjonen​</normalized_url>​
    <share_count>​35​</share_count>​
    <like_count>​402​</like_count>​
    <comment_count>​10​</comment_count>​
    <total_count>​447​</total_count>​
    <click_count>​0​</click_count>​
    <comments_fbid>​676768902366174​</comments_fbid>​
    <commentsbox_count>​0​</commentsbox_count>​
  </link_stat>​
</links_getStats_response>​

要遍历这棵树并获得<like_count>元素的文本内容,我要这样做:

data.firstChild.childNodes[1].childNodes[7].textContent;

这让我回到了在E4X之前AS3中处理XML的方式。我不禁觉得这是相当脆弱的,所以我决定在访问返回的数据之前验证它的完整性是一个好主意。这就给我留下了这个圣诞树复合if语句:

if (data
    && data.childNodes.length > 0
    && data.firstChild.childNodes.length > 1
    && data.firstChild.childNodes[1].childNodes.length > 7
    && data.firstChild.childNodes[1].childNodes[7].textContent) {
  // OK, we're good, go ahead..
}

真的吗? ?

您需要做的是使用XPath,例如在您的示例中获取like_count元素:

var elem = data.selectSingleNode('/links_getStats_response/link_stat/like_count'); // assign the element
var value = elem.nodeValue; // to get the element value

有关XPath的更多信息,请参阅以下链接

有点厚颜无耻,但确实是更好的选择,因为我已经在使用jQuery:

var numLikes = $('like_count', data).text();

或者不惜一切代价避免使用jQuery:

var numLikes = xml.querySelector('like_count').textContent;