RSS和Atom是站点对外输出内容更新最常用的两种订阅格式,本质都是结构化的XML文档。很多资讯聚合页、企业官网的新闻板块、个人博客的友链动态区,都可以直接读取第三方站点的订阅源来实现自动更新。本文围绕jQuery提供的jQuery.parseXML()方法,讲解如何把一份XML字符串解析成文档对象,再逐条提取条目信息,最终在页面上渲染出一个动态的新闻列表。整个方案不需要后端参与,纯前端即可完成。

一、认识jQuery.parseXML()的工作原理
先看方法签名:jQuery.parseXML(data)。它接收一个XML格式的字符串,内部会调用浏览器原生的DOMParser(现代浏览器)或ActiveXObject(老旧IE)把字符串解析成一份标准的XML文档对象,返回后就可以像操作普通DOM一样,用$(xmlDoc).find()去检索节点。
这个方法的价值在于屏蔽了浏览器差异。如果直接手写DOMParser,还得考虑IE8及以下的环境判断,而jQuery把这层兼容逻辑封装掉了。需要注意的是,解析失败时不同jQuery版本行为略有差别:老版本可能返回一个包含错误信息的文档对象,新版本在遇到严重格式错误时会抛出异常,所以建议用try...catch包一层做防御。
下面用一个最小示例演示解析过程:
var xmlString = '<rss version="2.0"><channel><item><title>第一篇文章</title></item></channel></rss>';
var xmlDoc = $.parseXML(xmlString);
var $xml = $(xmlDoc);
var firstTitle = $xml.find('item title').first().text();
console.log(firstTitle); // 输出:第一篇文章可以看到,解析成功后拿到的$xml是一个jQuery包装对象,所有熟悉的find、each、attr、text方法都能直接使用,学习成本几乎为零。
二、RSS与Atom格式的节点差异及统一处理
RSS 2.0的条目在item节点下,标题是title,链接是link,发布时间是pubDate。而Atom格式的条目节点叫entry,发布时间叫updated或published,链接还带href属性和rel属性。写解析逻辑前必须先弄清两者的结构差异,否则很容易出现RSS能读、Atom读不到数据的情况。
两种格式简化后的结构大致如下:
<!-- RSS 2.0 -->
<rss version="2.0">
<channel>
<item>
<title>文章标题</title>
<link>https://ipipp.com/article/1</link>
<pubDate>Mon, 01 Jan 2024 08:00:00 GMT</pubDate>
</item>
</channel>
</rss>
<!-- Atom -->
<feed xmlns="http://www.w3.org/2005/Atom">
<entry>
<title>文章标题</title>
<link rel="alternate" href="https://ipipp.com/article/1"/>
<updated>2024-01-01T08:00:00Z</updated>
</entry>
</feed>有一个容易被忽略的坑:Atom文档通常带有xmlns命名空间声明。部分浏览器在find时用简单标签名可能匹配不到节点,稳妥的做法是解析前检测文档根节点是rss还是feed,确定格式后再分别编写提取逻辑,或者直接用getElementsByTagNameNS处理命名空间问题。实际项目中推荐做一次格式判断,把两种格式的数据统一映射成同一个JavaScript对象,后续渲染逻辑就完全一致了。
function normalizeEntry($node, type) {
if (type === 'rss') {
return {
title: $node.find('title').text(),
link: $node.find('link').text(),
date: $node.find('pubDate').text()
};
} else {
return {
title: $node.find('title').text(),
link: $node.find('link').attr('href') || '',
date: $node.find('updated').text() || $node.find('published').text()
};
}
}三、完整实现:从请求到渲染新闻列表
接下来把整个流程串起来。思路分三步:第一步通过$.ajax请求订阅源,注意要把dataType设为xml,jQuery拿到数据后可以直接给出DOM,也可以拿到字符串后自己调用$.parseXML;第二步遍历条目节点,把字段提取出来;第三步用数组拼接HTML字符串,一次性插入页面容器,避免在循环里频繁操作DOM造成性能损耗。
$(function () {
var feedUrl = 'https://ipipp.com/feed.xml';
$.ajax({
url: feedUrl,
dataType: 'xml',
success: function (xmlDoc) {
var $xml = $(xmlDoc);
var isRss = $xml.find('rss').length > 0 || $xml.find('channel').length > 0;
var entries = isRss ? $xml.find('item') : $xml.find('entry');
var type = isRss ? 'rss' : 'atom';
var html = [];
entries.slice(0, 10).each(function () {
var item = normalizeEntry($(this), type);
html.push(
'<li class="news-item">' +
'<a href="' + item.link + '" target="_blank" rel="noopener">' +
item.title +
'</a>' +
'<span class="news-date">' + formatDate(item.date) + '</span>' +
'</li>'
);
});
$('#news-list').html(html.join(''));
},
error: function () {
$('#news-list').html('<li class="error">订阅源加载失败,请稍后重试</li>');
}
});
});
function formatDate(str) {
var d = new Date(str);
if (isNaN(d.getTime())) return '';
return d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate();
}对应的页面结构很简单,准备一个列表容器即可:
<ul id="news-list"></ul>
如果数据源返回的是字符串而不是DOM(比如走了本地缓存或代理接口),就把success里的第一行换成var $xml = $($.parseXML(responseText));,其余逻辑完全不变。这正是parseXML作为独立方法存在的意义——它让你对解析时机有完全的掌控。
四、跨域限制与安全注意事项
浏览器同源策略是这套方案最大的现实障碍。直接请求第三方域名的XML文件会被拦截,常见解决办法有三种:一是让第三方源开启CORS响应头;二是自己服务器上写一个反向代理转发;三是借助一些公开的RSS转JSON代理服务。生产环境更推荐前两种,可控性和安全性都更好。
安全性方面有两点务必注意。其一,条目里的title、link来自外部源,直接拼进HTML存在XSS风险,插入前应对内容做转义,至少要处理<、>、引号等字符,或者用$(...).text()的方式构建节点而不是拼字符串。其二,跳转链接要校验协议是http或https,防止javascript:伪协议注入。示例代码为了简洁省略了这些处理,实际落地时一定要补上:
function escapeHtml(str) {
return String(str)
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"');
}
function safeLink(url) {
return /^https?:\/\//i.test(url) ? url : '#';
}总结一下,jQuery.parseXML()配合$.ajax可以在几十行代码内实现订阅源的读取与渲染,核心工作量在于格式判断和字段提取的兼容处理。只要处理好跨域与内容转义,这套方案非常适合静态站点、内部系统快速接入外部资讯内容。
jQuery.parseXMLRSS解析新闻列表渲染修改时间:2026-09-05 15:38:57