首页 > 解决方案 > 如何检查一个元素是否存在于 xml RSS 提要中

问题描述

我有一个显示 RSS 提要的小部件。但并非所有项目都包含所有元素。如何检查元素是否存在?

该行失败:

child: Image.network(item.media.contents.first.url, height: 105, width: 105),

没有媒体元素。如何检查并跳过违规行?

  @override
  Widget build(BuildContext context) {
    print (this.feed3.items.length);
    return Scaffold(
      body: ListView.builder(
          itemCount: this.feed3.items.length,
          itemBuilder: (BuildContext ctxt, int index) {
            final item = this.feed3.items[index];
            return   InkWell(
          child: ListTile(
              leading: ConstrainedBox(
                constraints: BoxConstraints(
                  minWidth: 105,
                  minHeight: 105,
                  maxWidth: 105,
                  maxHeight: 105,
                ),
                child: Image.network(item.media.contents.first.url, height: 105, width: 105),
              ),
              title: Text(item.title),
              subtitle: Text(item.pubDate),
              contentPadding: EdgeInsets.all(16.0),
            ),
          onTap: () {
            showLink(item.link);
          },
        );
          }),
    );
  }

这是饲料

标签: flutterdart

解决方案


我推荐你使用xml2json包。因此更容易检测映射中是否存在任何键。

我已经使用下面的代码来显示提取的提要中的一些字段:

import 'dart:async';
import 'dart:io';

import 'package:wnetworking/wnetworking.dart';

typedef JMap = Map<String, dynamic>;

class RssApp {
  static const _base = 'https://rss.app/feeds';

  static FutureOr<void> fetchFeeds() async {
    var url = '$_base/_DawozSyanCYfGaQg.xmlRSS Feed';
    stdout.write('Fetching feeds... ');
    var feeds = <JMap>[];

    await HttpReqService.getXml2Json<JMap>(url, convention: X2JConvention.Badgerfish)
      .then((response) {
        if (response != null) {
          var items = response['rss']['channel']['item'] as List;
          items.forEach((item) {
            feeds.add({
              'title': item['title']['__cdata'],
              'pubDate': item['pubDate']['\$'],
              'url': item['media:content']?['@url'],
              'medium': item['media:content']?['@medium'],
            });
          });
        };
      })
      .whenComplete(() {
        print('done.');
        print('Number of feeds: ${feeds.length}\n');
        print(feeds);
      });
  }
}

void main(List<String> args) async {
  await RssApp.fetchFeeds();
  print('\nJob done!');
}

结果:

Fetching feeds... done.
Number of feeds: 25

[{title: New York State wants to hear from you.  Share your thoughts regarding re-opening schools on the Thought Exchange at http..., pubDate: Thu, 20 May 2021 14:32:58 GMT, url: https://external-ort2-2.xx.fbcdn.net/safe_image.php?d=AQGgr5DIPtLjqzbO&w=540&h=282&url=https%3A%2F%2Fdpe2badxax7zn.cloudfront.net%2Fmw%2F5.0.0.b122%2Fassets%2Fte-meta-tag-1200x628.png&cfs=1&upscale=1&fallback=news_d_placeholder_publisher&ccb=3-5&_nc_hash=AQEhucF_63qRKaF4, medium: image},
....
{title: https://www.huffpost.com/…/kids-movies-celebrate-diversity_…, pubDate: Sun, 14 Mar 2021 20:18:40 GMT, url: https://external-sea1-1.xx.fbcdn.net/safe_image.php?d=AQE-pzCH1t0n6utx&w=540&h=282&url=https%3A%2F%2Fimg.huffingtonpost.com%2Fasset%2F600b08c6260000140bacf867.png%3Fcache%3DfhVGM0z574%26ops%3D1778_1000&cfs=1&upscale=1&fallback=news_d_placeholder_publisher&ccb=3-5&_nc_hash=AQGSesvbHTiaclsF, medium: image}]

Job done!

HttpReqService.getXml2Json函数(来自wnetworking尚未准备发布的包,抱歉)使用Xml2Json对象来转换 XML 数据,重要的是要注意convention使用,此代码Badgerfish用于Xml2Json对象。


推荐阅读