Tôi cần phân tích nguồn cấp RSS (phiên bản XML 2.0) và hiển thị các chi tiết được phân tích cú pháp trong trang HTML.
Tôi cần phân tích nguồn cấp RSS (phiên bản XML 2.0) và hiển thị các chi tiết được phân tích cú pháp trong trang HTML.
Câu trả lời:
(Đừng thực sự khuyên bạn rằng, hãy xem các tùy chọn khác.)
jQuery.getFeed({
url : FEED_URL,
success : function (feed) {
console.log(feed.title);
// do more stuff here
}
});
$.get(FEED_URL, function (data) {
$(data).find("entry").each(function () { // or "item" or whatever suits your feed
var el = $(this);
console.log("------------------------");
console.log("title : " + el.find("title").text());
console.log("author : " + el.find("author").text());
console.log("description: " + el.find("description").text());
});
});
$.ajax({
url : document.location.protocol + '//ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&callback=?&q=' + encodeURIComponent(FEED_URL),
dataType : 'json',
success : function (data) {
if (data.responseData.feed && data.responseData.feed.entries) {
$.each(data.responseData.feed.entries, function (i, e) {
console.log("------------------------");
console.log("title : " + e.title);
console.log("author : " + e.author);
console.log("description: " + e.description);
});
}
}
});
Nhưng điều đó có nghĩa là bạn tin tưởng vào việc họ đang trực tuyến và có thể truy cập.
Khi bạn đã trích xuất thành công thông tin bạn cần từ nguồn cấp dữ liệu, bạn có thể tạo DocumentFragment
s (có document.createDocumentFragment()
chứa các yếu tố (được tạo bằng document.createElement()
) bạn sẽ muốn tiêm để hiển thị dữ liệu của mình.
Chọn thành phần chứa mà bạn muốn trên trang và nối các đoạn tài liệu của bạn vào đó và chỉ cần sử dụng InternalHTML để thay thế hoàn toàn nội dung của nó.
Cái gì đó như:
$('#rss-viewer').append(aDocumentFragmentEntry);
hoặc là:
$('#rss-viewer')[0].innerHTML = aDocumentFragmentOfAllEntries.innerHTML;
Sử dụng nguồn cấp dữ liệu của câu hỏi này , mà khi viết bài này đưa ra:
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:re="http://purl.org/atompub/rank/1.0">
<title type="text">How to parse a RSS feed using javascript? - Stack Overflow</title>
<link rel="self" href="https://stackoverflow.com/feeds/question/10943544" type="application/atom+xml" />
<link rel="hub" href="http://pubsubhubbub.appspot.com/" />
<link rel="alternate" href="https://stackoverflow.com/q/10943544" type="text/html" />
<subtitle>most recent 30 from stackoverflow.com</subtitle>
<updated>2012-06-08T06:36:47Z</updated>
<id>https://stackoverflow.com/feeds/question/10943544</id>
<creativeCommons:license>http://www.creativecommons.org/licenses/by-sa/3.0/rdf</creativeCommons:license>
<entry>
<id>https://stackoverflow.com/q/10943544</id>
<re:rank scheme="http://stackoverflow.com">2</re:rank>
<title type="text">How to parse a RSS feed using javascript?</title>
<category scheme="https://stackoverflow.com/feeds/question/10943544/tags" term="javascript"/><category scheme="https://stackoverflow.com/feeds/question/10943544/tags" term="html5"/><category scheme="https://stackoverflow.com/feeds/question/10943544/tags" term="jquery-mobile"/>
<author>
<name>Thiru</name>
<uri>https://stackoverflow.com/users/1126255</uri>
</author>
<link rel="alternate" href="/programming/10943544/how-to-parse-a-rss-feed-using-javascript" />
<published>2012-06-08T05:34:16Z</published>
<updated>2012-06-08T06:35:22Z</updated>
<summary type="html">
<p>I need to parse the RSS-Feed(XML version2.0) using XML and I want to display the parsed detail in HTML page, I tried in many ways. But its not working. My system is running under proxy, since I am new to this field, I don't know whether it is possible or not. If any one knows please help me on this. Thanks in advance.</p>
</summary>
</entry>
<entry>
<id>https://stackoverflow.com/questions/10943544/-/10943610#10943610</id>
<re:rank scheme="http://stackoverflow.com">1</re:rank>
<title type="text">Answer by haylem for How to parse a RSS feed using javascript?</title>
<author>
<name>haylem</name>
<uri>https://stackoverflow.com/users/453590</uri>
</author>
<link rel="alternate" href="/programming/10943544/how-to-parse-a-rss-feed-using-javascript/10943610#10943610" />
<published>2012-06-08T05:43:24Z</published>
<updated>2012-06-08T06:35:22Z</updated>
<summary type="html"><h1>Parsing the Feed</h1>
<h3>With jQuery's jFeed</h3>
<p>Try this, with the <a href="http://plugins.jquery.com/project/jFeed" rel="nofollow">jFeed</a> <a href="http://www.jquery.com/" rel="nofollow">jQuery</a> plug-in</p>
<pre><code>jQuery.getFeed({
url : FEED_URL,
success : function (feed) {
console.log(feed.title);
// do more stuff here
}
});
</code></pre>
<h3>With jQuery's Built-in XML Support</h3>
<pre><code>$.get(FEED_URL, function (data) {
$(data).find("entry").each(function () { // or "item" or whatever suits your feed
var el = $(this);
console.log("------------------------");
console.log("title : " + el.find("title").text());
console.log("author : " + el.find("author").text());
console.log("description: " + el.find("description").text());
});
});
</code></pre>
<h3>With jQuery and the Google AJAX APIs</h3>
<p>Otherwise, <a href="https://developers.google.com/feed/" rel="nofollow">Google's AJAX Feed API</a> allows you to get the feed as a JSON object:</p>
<pre><code>$.ajax({
url : document.location.protocol + '//ajax.googleapis.com/ajax/services/feed/load?v=1.0&amp;num=10&amp;callback=?&amp;q=' + encodeURIComponent(FEED_URL),
dataType : 'json',
success : function (data) {
if (data.responseData.feed &amp;&amp; data.responseData.feed.entries) {
$.each(data.responseData.feed.entries, function (i, e) {
console.log("------------------------");
console.log("title : " + e.title);
console.log("author : " + e.author);
console.log("description: " + e.description);
});
}
}
});
</code></pre>
<p>But that means you're relient on them being online and reachable.</p>
<hr>
<h1>Building Content</h1>
<p>Once you've successfully extracted the information you need from the feed, you need to create document fragments containing the elements you'll want to inject to display your data.</p>
<hr>
<h1>Injecting the content</h1>
<p>Select the container element that you want on the page and append your document fragments to it, and simply use innerHTML to replace its content entirely.</p>
</summary>
</entry></feed>
Kêu gọi:
$.get('https://stackoverflow.com/feeds/question/10943544', function (data) {
$(data).find("entry").each(function () { // or "item" or whatever suits your feed
var el = $(this);
console.log("------------------------");
console.log("title : " + el.find("title").text());
console.log("author : " + el.find("author").text());
console.log("description: " + el.find("description").text());
});
});
In ra:
------------------------
title : How to parse a RSS feed using javascript?
author :
Thiru
https://stackoverflow.com/users/1126255
description:
------------------------
title : Answer by haylem for How to parse a RSS feed using javascript?
author :
haylem
https://stackoverflow.com/users/453590
description:
Kêu gọi:
$.ajax({
url : document.location.protocol + '//ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&callback=?&q=' + encodeURIComponent('https://stackoverflow.com/feeds/question/10943544'),
dataType : 'json',
success : function (data) {
if (data.responseData.feed && data.responseData.feed.entries) {
$.each(data.responseData.feed.entries, function (i, e) {
console.log("------------------------");
console.log("title : " + e.title);
console.log("author : " + e.author);
console.log("description: " + e.description);
});
}
}
});
In ra:
------------------------
title : How to parse a RSS feed using javascript?
author : Thiru
description: undefined
------------------------
title : Answer by haylem for How to parse a RSS feed using javascript?
author : haylem
description: undefined
Một tùy chọn không dùng nữa (nhờ @daylight) và dễ nhất đối với tôi (đây là những gì tôi đang sử dụng cho SpokenToday.info ):
Các API cấp dữ liệu Google mà không sử dụng JQuery và chỉ với 2 bước sau:
Nhập thư viện:
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">google.load("feeds", "1");</script>
Tìm / Tải nguồn cấp dữ liệu ( tài liệu ):
var feed = new google.feeds.Feed('http://www.google.com/trends/hottrends/atom/feed?pn=p1');
feed.load(function (data) {
// Parse data depending on the specified response format, default is JSON.
console.dir(data);
});
Để phân tích dữ liệu, kiểm tra tài liệu về định dạng phản hồi .
document.getElementById('image').style.backgroundImage = "url('" + src + "')";
Nếu bạn đang tìm kiếm một giải pháp thay thế đơn giản và miễn phí cho Google Feed API cho tiện ích rss của mình thì rss2json.com có thể là một giải pháp phù hợp cho việc đó.
Bạn có thể thử xem nó hoạt động như thế nào trên một mã mẫu từ tài liệu api bên dưới:
google.load("feeds", "1");
function initialize() {
var feed = new google.feeds.Feed("https://news.ycombinator.com/rss");
feed.load(function(result) {
if (!result.error) {
var container = document.getElementById("feed");
for (var i = 0; i < result.feed.entries.length; i++) {
var entry = result.feed.entries[i];
var div = document.createElement("div");
div.appendChild(document.createTextNode(entry.title));
container.appendChild(div);
}
}
});
}
google.setOnLoadCallback(initialize);
<html>
<head>
<script src="https://rss2json.com/gfapi.js"></script>
</head>
<body>
<p><b>Result from the API:</b></p>
<div id="feed"></div>
</body>
</html>
Đối với bất kỳ ai khác đọc điều này (vào năm 2019 trở đi), thật không may, hầu hết các triển khai đọc RSS của JS hiện không hoạt động. Đầu tiên, Google API đã ngừng hoạt động nên đây không còn là một tùy chọn nữa và vì chính sách bảo mật của CORS, hiện tại bạn không thể yêu cầu các nguồn cấp dữ liệu RSS tên miền chéo.
Sử dụng ví dụ trên https://www.raymondcamden.com/2015/12/08/parsing-rss-feed-in-javascript-options (2015) Tôi nhận được như sau:
Access to XMLHttpRequest at 'https://feeds.feedburner.com/raymondcamdensblog?format=xml' from origin 'MYSITE' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Điều này là chính xác và là một biện pháp phòng ngừa bảo mật của trang web cuối nhưng hiện tại có nghĩa là các câu trả lời ở trên không có khả năng hoạt động.
Cách giải quyết của tôi có lẽ là phân tích nguồn cấp RSS thông qua PHP và cho phép javascript truy cập PHP của tôi thay vì cố gắng truy cập vào nguồn cấp dữ liệu đích cuối.
Nếu bạn muốn sử dụng API javascript đơn giản, có một ví dụ hay tại https://github.com/hongkiat/js-rss-reader/
Mô tả đầy đủ tại https://www.hongkiat.com/blog/rss-reader-in-javascript/
Nó sử dụng fetch
phương thức như một phương thức toàn cầu tìm nạp tài nguyên không đồng bộ. Dưới đây là một đoạn mã:
fetch(websiteUrl).then((res) => {
res.text().then((htmlTxt) => {
var domParser = new DOMParser()
let doc = domParser.parseFromString(htmlTxt, 'text/html')
var feedUrl = doc.querySelector('link[type="application/rss+xml"]').href
})
}).catch(() => console.error('Error in fetching the website'))
Bạn có thể sử dụng jquery-rss hoặc Vanilla RSS , đi kèm với tạo khuôn mẫu đẹp và cực kỳ dễ sử dụng:
// Example for jquery.rss
$("#your-div").rss("https://stackoverflow.com/feeds/question/10943544", {
limit: 3,
layoutTemplate: '<ul class="inline">{entries}</ul>',
entryTemplate: '<li><a href="{url}">[{author}@{date}] {title}</a><br/>{shortBodyPlain}</li>'
})
// Example for Vanilla RSS
const RSS = require('vanilla-rss');
const rss = new RSS(
document.querySelector("#your-div"),
"https://stackoverflow.com/feeds/question/10943544",
{
// options go here
}
);
rss.render().then(() => {
console.log('Everything is loaded and rendered');
});
Xem http://jsfiddle.net/sdepold/ozq2dn9e/1/ để biết ví dụ hoạt động.
Cố gắng tìm một giải pháp tốt cho việc này ngay bây giờ, tôi đã tình cờ thấy Plugin Feed RSS RSS / ATOM của FeedEk thực hiện công việc phân tích và hiển thị các nguồn cấp dữ liệu RSS và Atom thông qua API nguồn cấp dữ liệu jQuery . Đối với nguồn cấp RSS dựa trên XML cơ bản, tôi đã thấy nó hoạt động như một bùa mê và không cần các tập lệnh phía máy chủ hoặc các cách giải quyết CORS khác để nó chạy ngay cả cục bộ.
Tôi đã rất bực tức vì nhiều bài báo và câu trả lời sai lệch đến nỗi tôi đã viết trình đọc RSS của riêng mình: https://gouessej.wordpress.com/2020/06/28/comment-creer-un-lecteur-rss-en-javascript-how- to-created-a-rss-reader-in-javascript /
Bạn có thể sử dụng các yêu cầu AJAX để tìm nạp các tệp RSS nhưng nó sẽ hoạt động nếu và chỉ khi bạn sử dụng proxy CORS. Tôi sẽ cố gắng viết proxy CORS của riêng tôi để cung cấp cho bạn một giải pháp mạnh mẽ hơn. Trong khi đó, nó hoạt động, tôi đã triển khai nó trên máy chủ của mình trong Debian Linux.
Giải pháp của tôi không sử dụng JQuery, tôi chỉ sử dụng các API tiêu chuẩn Javascript đơn giản không có thư viện bên thứ ba và nó được cho là hoạt động ngay cả với Microsoft Internet Explorer 11.