【问题标题】:Cannot access xml attributes when looping over items of xml2js-parsed json循环遍历 xml2js-parsed json 的项目时无法访问 xml 属性
【发布时间】:2019-09-22 07:29:06
【问题描述】:

在使用xml2js 将 xml 解析为 json 之后,我正在尝试访问 xml rss 提要中项目的属性。我可以使用items[0].el.$.attribute 访问individual attributes。但是,如果我遍历每个项目,我将无法比el 更深入。尝试深入循环(使用items.map(item => { item.el.$ }))会给我一个错误,其中 el 现在未定义...

TypeError: Cannot read property '$' of undefined

这是[DEMO] 和我的代码 (╭ರ_•́)

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.log(items[0].enclosure.$.url)

      // THIS DOES NOT WORK... ಠ_ಠ
      items.map(item => {
        console.log(item.enclosure.$.url);
      })

      // THIS WORKS! (╯°o°)╯
      items.map(item => {
        console.log(item.enclosure);
      })

    })
  })
})

// listen for requests :)
const listener = app.listen(process.env.PORT, function() {
  console.log('Your app is listening on port ' + listener.address().port);
});

在上面的示例中,我正在使用 xml2js 解析这个 rss feed on kijiji。解析后,我可以使用json.rss.channel.item[0].enclosure.$.url 访问元素属性。

但是,如果我循环遍历这些项目(使用 for 循环、forEachmap),我无法比 json.rss.channel.item[0].enclosure 更深入。

我在这里错过了什么?

【问题讨论】:

    标签: javascript node.js json xml-parsing xml2js


    【解决方案1】:

    在本地运行示例,我看到带有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 =&gt; { item.enclosure ? posts.push(item.enclosure.$.url) : posts.push(item.enclosure); })
    猜你喜欢
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多