The Webfeed Flutter package for Appeto SDK.
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

104 rader
3.3 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. [],
  79. skipHours: findElementOrNull(channelElement, "skipHours")
  80. ?.findAllElements("hour")
  81. ?.map((element) {
  82. return int.tryParse(element.text ?? "0");
  83. })?.toList() ??
  84. [],
  85. lastBuildDate: findElementOrNull(channelElement, "lastBuildDate")?.text,
  86. language: findElementOrNull(channelElement, "language")?.text,
  87. generator: findElementOrNull(channelElement, "generator")?.text,
  88. copyright: findElementOrNull(channelElement, "copyright")?.text,
  89. docs: findElementOrNull(channelElement, "docs")?.text,
  90. managingEditor: findElementOrNull(channelElement, "managingEditor")?.text,
  91. rating: findElementOrNull(channelElement, "rating")?.text,
  92. webMaster: findElementOrNull(channelElement, "webMaster")?.text,
  93. ttl: int.tryParse(findElementOrNull(channelElement, "ttl")?.text ?? "0"),
  94. dc: DublinCore.parse(channelElement),
  95. );
  96. }
  97. }