The Webfeed Flutter package for Appeto SDK.
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

102 líneas
3.2 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 author;
  12. final String description;
  13. final String link;
  14. final List<RssItem> items;
  15. final RssImage image;
  16. final RssCloud cloud;
  17. final List<RssCategory> categories;
  18. final List<String> skipDays;
  19. final List<int> skipHours;
  20. final String lastBuildDate;
  21. final String language;
  22. final String generator;
  23. final String copyright;
  24. final String docs;
  25. final String managingEditor;
  26. final String rating;
  27. final String webMaster;
  28. final int ttl;
  29. final DublinCore dc;
  30. RssFeed({
  31. this.title,
  32. this.author,
  33. this.description,
  34. this.link,
  35. this.items,
  36. this.image,
  37. this.cloud,
  38. this.categories,
  39. this.skipDays,
  40. this.skipHours,
  41. this.lastBuildDate,
  42. this.language,
  43. this.generator,
  44. this.copyright,
  45. this.docs,
  46. this.managingEditor,
  47. this.rating,
  48. this.webMaster,
  49. this.ttl,
  50. this.dc,
  51. });
  52. factory RssFeed.parse(String xmlString) {
  53. var document = parse(xmlString);
  54. XmlElement channelElement;
  55. try {
  56. channelElement = document.findAllElements("channel").first;
  57. } on StateError {
  58. throw ArgumentError("channel not found");
  59. }
  60. return RssFeed(
  61. title: findElementOrNull(channelElement, "title")?.text,
  62. author: findElementOrNull(channelElement, "author")?.text,
  63. description: findElementOrNull(channelElement, "description")?.text,
  64. link: findElementOrNull(channelElement, "link")?.text,
  65. items: channelElement.findElements("item").map((element) {
  66. return RssItem.parse(element);
  67. }).toList(),
  68. image: RssImage.parse(findElementOrNull(channelElement, "image")),
  69. cloud: RssCloud.parse(findElementOrNull(channelElement, "cloud")),
  70. categories: channelElement.findElements("category").map((element) {
  71. return RssCategory.parse(element);
  72. }).toList(),
  73. skipDays: findElementOrNull(channelElement, "skipDays")
  74. ?.findAllElements("day")
  75. ?.map((element) {
  76. return element.text;
  77. })?.toList() ?? [],
  78. skipHours: findElementOrNull(channelElement, "skipHours")
  79. ?.findAllElements("hour")
  80. ?.map((element) {
  81. return int.tryParse(element.text ?? "0");
  82. })?.toList() ?? [],
  83. lastBuildDate: findElementOrNull(channelElement, "lastBuildDate")?.text,
  84. language: findElementOrNull(channelElement, "language")?.text,
  85. generator: findElementOrNull(channelElement, "generator")?.text,
  86. copyright: findElementOrNull(channelElement, "copyright")?.text,
  87. docs: findElementOrNull(channelElement, "docs")?.text,
  88. managingEditor: findElementOrNull(channelElement, "managingEditor")?.text,
  89. rating: findElementOrNull(channelElement, "rating")?.text,
  90. webMaster: findElementOrNull(channelElement, "webMaster")?.text,
  91. ttl: int.tryParse(findElementOrNull(channelElement, "ttl")?.text ?? "0"),
  92. dc: DublinCore.parse(channelElement),
  93. );
  94. }
  95. }