Парсинг XML / RSS с URL с использованием Java Script - PullRequest
19 голосов
/ 23 ноября 2011

Привет, я хочу проанализировать xml / rss из реального URL, например http://rss.news.yahoo.com/rss/entertainment, используя чистый Java Script (не jquery) Я много гуглил. Ничто не сработало для меня. Может ли кто-нибудь помочь с рабочим куском кода.

Ответы [ 3 ]

37 голосов
/ 05 декабря 2011

(Вы не можете много гуглить.) После того, как вы обошли ту же Политику происхождения , и если ресурс обслуживается с 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 уровня 2 [Рабочий черновик] для других свойств обработчика событий.)

По сути: Не требуется синтаксический анализ. Если вы хотите получить доступ к данным XML, используйте стандартный DOM Level 2+ Core или DOM 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 для удобной, ориентированной на пространство имен оболочки DOM 3 XPath, которая не использует jQuery.)

Однако, если по какой-то (неправильной) причине MIME-тип не является XML-MIME-типом или если он не распознается реализацией DOM как таковой, вы можете использовать один из синтаксических анализаторов, встроенных в последние браузеры, для анализа responseText стоимость имущества. См. ответ Прадика о решении, которое работает в 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");
  // …
}

См. Также DOMParser и HTML5: Разбор и сериализация DOM (рабочий проект) .

11 голосов
/ 23 ноября 2011

Одна большая проблема, с которой вы можете столкнуться, заключается в том, что, как правило, вы не можете получить кросс-домен данных. Это большая проблема с большинством RSS-каналов.

Распространенный способ загрузки данных в кросс-домене javascript - это вызовы JSONP. По сути, это означает, что извлекаемые вами данные обернуты в функцию обратного вызова javascript. Вы загружаете URL-адрес тегом script и определяете функцию в своем коде. Поэтому, когда скрипт загружается, он выполняет функцию и передает ему данные в качестве аргумента.

Проблема с большинством каналов 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/.

0 голосов
/ 30 ноября 2011

лучше конвертировать XML в JSON. http://jsontoxml.utilities -online.info /

после конвертации, если вам нужно напечатать объект json, проверьте этот урок http://www.w3schools.com/json/json_eval.asp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...