The Webfeed Flutter package for Appeto SDK.
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

99 linhas
3.1 KiB

  1. import 'dart:core';
  2. import 'package:webfeed/domain/dublin_core/dublin_core.dart';
  3. import 'package:webfeed/domain/rss_category.dart';
  4. import 'package:webfeed/domain/rss_cloud.dart';
  5. import 'package:webfeed/domain/rss_image.dart';
  6. import 'package:webfeed/domain/rss_item.dart';
  7. import 'package:webfeed/util/helpers.dart';
  8. import 'package:xml/xml.dart';
  9. class RssFeed {
  10. final String title;
  11. final String description;
  12. final String link;
  13. final List<RssItem> items;
  14. final RssImage image;
  15. final RssCloud cloud;
  16. final List<RssCategory> categories;
  17. final List<String> skipDays;
  18. final List<int> skipHours;
  19. final String lastBuildDate;
  20. final String language;
  21. final String generator;
  22. final String copyright;
  23. final String docs;
  24. final String managingEditor;
  25. final String rating;
  26. final String webMaster;
  27. final int ttl;
  28. final DublinCore dc;
  29. RssFeed({
  30. this.title,
  31. this.description,
  32. this.link,
  33. this.items,
  34. this.image,
  35. this.cloud,
  36. this.categories,
  37. this.skipDays,
  38. this.skipHours,
  39. this.lastBuildDate,
  40. this.language,
  41. this.generator,
  42. this.copyright,
  43. this.docs,
  44. this.managingEditor,
  45. this.rating,
  46. this.webMaster,
  47. this.ttl,
  48. this.dc,
  49. });
  50. factory RssFeed.parse(String xmlString) {
  51. var document = parse(xmlString);
  52. XmlElement channelElement;
  53. try {
  54. channelElement = document.findAllElements("channel").first;
  55. } on StateError {
  56. throw ArgumentError("channel not found");
  57. }
  58. return RssFeed(
  59. title: findElementOrNull(channelElement, "title")?.text,
  60. description: findElementOrNull(channelElement, "description")?.text,
  61. link: findElementOrNull(channelElement, "link")?.text,
  62. items: channelElement.findElements("item").map((element) {
  63. return RssItem.parse(element);
  64. }).toList(),
  65. image: RssImage.parse(findElementOrNull(channelElement, "image")),
  66. cloud: RssCloud.parse(findElementOrNull(channelElement, "cloud")),
  67. categories: channelElement.findElements("category").map((element) {
  68. return RssCategory.parse(element);
  69. }).toList(),
  70. skipDays: findElementOrNull(channelElement, "skipDays")
  71. ?.findAllElements("day")
  72. ?.map((element) {
  73. return element.text;
  74. })?.toList() ?? [],
  75. skipHours: findElementOrNull(channelElement, "skipHours")
  76. ?.findAllElements("hour")
  77. ?.map((element) {
  78. return int.tryParse(element.text ?? "0");
  79. })?.toList() ?? [],
  80. lastBuildDate: findElementOrNull(channelElement, "lastBuildDate")?.text,
  81. language: findElementOrNull(channelElement, "language")?.text,
  82. generator: findElementOrNull(channelElement, "generator")?.text,
  83. copyright: findElementOrNull(channelElement, "copyright")?.text,
  84. docs: findElementOrNull(channelElement, "docs")?.text,
  85. managingEditor: findElementOrNull(channelElement, "managingEditor")?.text,
  86. rating: findElementOrNull(channelElement, "rating")?.text,
  87. webMaster: findElementOrNull(channelElement, "webMaster")?.text,
  88. ttl: int.tryParse(findElementOrNull(channelElement, "ttl")?.text ?? "0"),
  89. dc: DublinCore.parse(channelElement),
  90. );
  91. }
  92. }