如何用原生JavaScript获取RSS中<content:encoded>节点的内容?
原生JavaScript获取RSS中content:encoded节点的解决方案
嘿,这个问题我太熟悉了!带命名空间的XML元素在原生JS里确实不能直接用content\\:encoded这种写法来获取,jQuery帮我们做了底层的兼容处理,但原生JS得用专门的命名空间方法才行。
问题原因
<content:encoded>节点属于http://purl.org/rss/1.0/modules/content/这个命名空间,原生getElementsByTagName无法正确解析带命名空间前缀的标签名,必须用**getElementsByTagNameNS**方法来指定命名空间URI和标签名。
修正后的代码
把你注释掉的那行替换成下面的写法,就能正常获取内容了:
var contentNode = item.getElementsByTagNameNS('http://purl.org/rss/1.0/modules/content/', 'encoded').item(0); var content = contentNode ? contentNode.textContent : ''; // 加个判断避免节点不存在时报错
完整的循环代码可以改成这样(顺便优化了DOM查找的性能):
var channel = xml.documentElement.getElementsByTagName("channel"); var items = xml.documentElement.getElementsByTagName("item"); var feedList = document.getElementById("feed"); // 提前获取DOM元素,避免循环内重复查找 for (var i = 0; i < items.length; i++) { var li = document.createElement('li'); var item = items.item(i); var title = item.getElementsByTagName("title").item(0).textContent; var link = item.getElementsByTagName("link").item(0).textContent; // 获取content:encoded内容 var contentNode = item.getElementsByTagNameNS('http://purl.org/rss/1.0/modules/content/', 'encoded').item(0); var content = contentNode ? contentNode.textContent : ''; li.innerHTML = '<a href="' + link + '">' + title + '</a><br>' + content; feedList.appendChild(li); }
关键说明
getElementsByTagNameNS的第一个参数是命名空间的完整URI(就是RSS里xmlns:content对应的值),第二个参数是不带前缀的标签名(也就是encoded,不是content:encoded)。- 加上节点存在性判断是个好习惯,防止某些RSS条目没有
content:encoded节点时抛出错误。
内容的提问来源于stack exchange,提问作者Meek
相关产品推荐
相关产品推荐

