簡體   English   中英

使用Java Script從URL解析XML / RSS

[英]Parsing XML / RSS from URL using Java Script

您好我想使用純Java腳本(而不是jquery)從http://rss.news.yahoo.com/rss/entertainment等實時網址解析xml / rss。 我google了很多。 沒有什么對我有用。 任何人都可以幫助處理一段代碼。

(您不能搜索很多內容。)一旦您解決了同源策略 ,並且資源以XML MIME類型在本例中為text/xml )提供,您可以執行以下操作:

var x = new XMLHttpRequest();
x.open("GET", "http://feed.example/", true);
x.onreadystatechange = function () {
  if (x.readyState == 4 && x.status == 200)
  {
    var doc = x.responseXML;
    // …
  }
};
x.send(null);

(另請參閱AJAX ,以及其他事件處理程序屬性的XMLHttpRequest Level 2規范[Working Draft]。)

實質上: 不需要解析。 如果您想訪問XML數據,請使用標准DOM Level 2+ CoreDOM Level 3 XPath方法,例如

/* DOM Level 2 Core */
var title = doc.getElementsByTagName("channel")[0].getElementsByTagName("title")[0].firstChild.nodeValue;

/* DOM Level 3 Core */
var title = doc.getElementsByTagName("channel")[0].getElementsByTagName("title")[0].textContent;

/* DOM Level 3 XPath (not using namespaces) */
var title = doc.evaluate('//channel/title/text()', doc, null, 0, null).iterateNext();

/* DOM Level 3 XPath (using namespaces) */
var namespaceResolver = (function () {
  var prefixMap = {
    media: "http://search.yahoo.com/mrss/",
    ynews: "http://news.yahoo.com/rss/"
  };

  return function (prefix) {
    return prefixMap[prefix] || null;
  };
}());

var url = doc.evaluate('//media:content/@url', doc, namespaceResolver, 0, null).iterateNext();

(另請參閱JSX:xpath.js以獲取不使用jQuery的方便的,名稱空間感知的DOM 3 XPath包裝器。)

但是,如果由於某些(錯誤的)原因,MIME類型不是XML MIME類型,或者DOM實現無法識別它,則可以使用最近瀏覽器中內置的解析器之一來解析responseText屬性值。 請參閱pradeek的答案 ,了解適用於IE / MSXML的解決方案。 以下應該適用於其他地方:

var parser = new DOMParser();
var doc = parser.parseFromString(x.responseText, "text/xml");

按上述步驟進行。

在運行時使用功能測試來確定給定實現的正確代碼分支。 最簡單的方法是:

if (typeof DOMParser != "undefined")
{
  var parser = new DOMParser();
  // …
}
else if (typeof ActiveXObject != "undefined")
{
  var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
  // …
}

另請參見DOMParserHTML5:DOM解析和序列化(工作草案)

您可能遇到的一個大問題是,通常情況下,您無法獲取跨域數據。 這是大多數rss feed的大問題。

處理在javascript跨域中加載數據的常用方法是調用JSONP。 基本上,這意味着您要檢索的數據包含在javascript回調函數中。 您使用腳本標記加載URL,然后在代碼中定義該函數。 因此,當腳本加載時,它會執行該函數並將數據作為參數傳遞給它。

大多數xml / rss提要的問題是僅提供xml的服務往往不提供JSONP包裝功能。

在進一步研究之前,請檢查您的數據源是否提供json格式和JSONP功能。 這將使這更容易。

現在,如果您的數據源提供json和jsonp功能,則必須具有創造性。

處理此問題的相對簡單方法是使用代理服務器。 您的代理在您控制的某個地方運行,並充當中間人以獲取您的數據。 服務器加載你的xml,然后你的javascript代替它做請求。 如果代理服務器運行在相同的域名上,那么您可以使用標准的xhr(ajax)請求,而不必擔心跨域的問題。

或者,您的代理服務器可以將數據包裝在jsonp回調中,您可以使用上面提到的方法。

如果您使用的是jQuery,那么xhr和jsonp請求是內置方法,因此編寫代碼非常容易。 其他常見的js庫也應該支持這些。 如果你從頭開始編寫所有這些,那么它的工作要多一些,但並不是非常困難。

現在,一旦你得到你的數據,希望它只是json。 然后就不需要解析了。

但是,如果你最終不得不堅持使用xml / rss版本,並且如果你是jQuery,你可以簡單地使用jQuery.parseXML http://api.jquery.com/jQuery.parseXML/

更好地將xml轉換為json。 http://jsontoxml.utilities-online.info/

轉換后如果需要打印json對象請查看本教程http://www.w3schools.com/json/json_eval.asp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM