Я пытаюсь получить доступ к атрибутам элементов в xml rss-канале после того, как xml был проанализирован в json с использованием xml2js. Я могу получить доступ к индивидуальные атрибуты, используя items[0].el.$.attribute. Однако, если я перебираю каждый элемент, я не могу углубиться дальше el. Попытка углубиться в цикл (используя items.map(item => { item.el.$ })) дает мне ошибку, где el теперь не определен...
TypeError: Cannot read property '$' of undefined
const express = require('express');
const { parseString } = require('xml2js');
const axios = require('axios');
const app = express();
app.use(express.static('public'));
app.get('/', async (req, res) => {
const rss = 'https://www.kijiji.ca/rss-srp-rv-camper-trailer/vancouver/c172l1700287'
axios.get(rss, { responseType: 'text'})
.then((res) => {
parseString(res.data, { explicitArray: false }, (err, res) => {
const items = res.rss.channel.item;
// THIS WORKS! (╯°o°)╯
console.info(items[0].enclosure.$.url)
// THIS DOES NOT WORK... ಠ_ಠ
items.map(item => {
console.info(item.enclosure.$.url);
})
// THIS WORKS! (╯°o°)╯
items.map(item => {
console.info(item.enclosure);
})
})
})
})
// listen for requests :)
const listener = app.listen(process.env.PORT, function() {
console.info('Your app is listening on port ' + listener.address().port);
});
В приведенном выше примере я анализирую этот RSS-канал Киджиджи с помощью xml2js. После синтаксического анализа я могу получить доступ к атрибутам элемента, используя json.rss.channel.item[0].enclosure.$.url.
Однако, если я перебираю элементы (используя цикл for, forEach или map), я не могу углубиться дальше, чем json.rss.channel.item[0].enclosure.
Что мне здесь не хватает?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Запустив пример локально, я вижу, что элемент с title: '1999 safari GMC van with wheelchair lift' не имеет свойства enclosure. Я думаю, что это больше проблема с данными, чем с JavaScript, кроме программирования, чтобы учесть это.
Вы можете подтвердить это следующей проверкой XML:
curl https://www.kijiji.ca/rss-srp-rv-camper-trailer/vancouver/c172l1700287 | grep -C 10 "1999 safari GMC van with wheelchair lift"
....
<item>
<title>1999 safari GMC van with wheelchair lift</title>
<link>https://www.kijiji.ca/v-travel-trailer-camper/vancouver/1999-safari-gmc-van-with-wheelchair-lift/1430028981</link>
<description>GMC van with lift for handycap</description>
<pubDate>Fri, 26 Apr 2019 23:33:07 GMT</pubDate>
<guid>https://www.kijiji.ca/v-travel-trailer-camper/vancouver/1999-safari-gmc-van-with-wheelchair-lift/1430028981</guid>
<dc:date>2019-04-26T23:33:07Z</dc:date>
<geo:lat>49.2819588</geo:lat>
<geo:long>-123.09482930000001</geo:long>
</item>
...
Уууууууу, ты так прав! Я предполагал, что есть изображение (
item.enclosure), а когда его нет, оно ломается. Спасибо, что нашли время, чтобы прочитать это! Это исправило мою проблему:items.map(item => { item.enclosure ? posts.push(item.enclosure.$.url) : posts.push(item.enclosure); })