Проблема в том, что вы пытаетесь проанализировать XML как HTML.Объект <link>
в HTML - это встроенный элемент, а не блок уровня, поэтому у него нет свойства textContent
для чтения jQuery, следовательно, вывод пустой.
Чтобы исправить это, сначала прочитайте XMLиспользуя $.parseXML()
, , затем поместите его в объект jQuery, который вы можете пройти.
Также есть пара вещей, на которые стоит обратить внимание.Во-первых, вам нужно будет удалить узел </xml>
в конце вывода XML, поскольку он недопустим и вызовет ошибку при запуске через $.parseXML
.Во-вторых, вы можете использовать map()
для создания массива вместо ручного вызова push()
для массива, и вы можете просто вернуть определение объекта непосредственно из этого.Попробуйте это:
var responseText = '<?xml version="1.0" encoding="UTF-8"?><channel><item><title>Title one</title><link>https://example.com/</link><pubDate>Mon, 12 Feb 2019</pubDate></item><item><title>Title two</title><link>https://foo.com/</link><pubDate>Tue, 13 Feb 2019</pubDate></item></channel>';
var xmlDoc = $.parseXML(responseText)
var posts = $('item', xmlDoc).map(function() {
var $item = $(this);
return {
title: $item.find('title').text(),
link: $item.find('link').text(),
date: $item.find('pubDate').text()
};
}).get();
console.log(posts);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Наконец, вы используете довольно странное сочетание JS и jQuery.Я бы предложил пойти с тем или другим.Таким образом, вот полная реализация jQuery с включенным AJAX-запросом:
$.ajax({
url: 'https://example.com/rssfeed/',
success: function(responseText) {
var xmlDoc = $.parseXML(responseText)
var posts = $('item', xmlDoc).map(function() {
var $item = $(this);
return {
title: $item.find('title').text(),
link: $item.find('link').text(),
date: $item.find('pubDate').text()
};
}).get();
// work with posts here...
}
});