flutter - 如何检查一个元素是否存在于 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);
},
);
}),
);
}
这是饲料
解决方案
我推荐你使用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
对象。