RssFeed.parse constructor

RssFeed.parse(
  1. String xmlString
)

Factory method to create an RssFeed object from an XML string representing an RSS feed.

This method parses the xmlString and extracts the relevant information from it to create an RssFeed object and returns it.

The extracted information includes the title, author, description, link, items, image, cloud, categories, skip days, skip hours, last build date, language, generator, copyright, docs, managing editor, rating, web master, time-to-live (ttl), Dublin Core metadata, iTunes metadata, syndication metadata, and podcast metadata.

Implementation

factory RssFeed.parse(String xmlString) {
  var document = XmlDocument.parse(xmlString);
  var rss = document.findElements('rss').firstOrNull;
  var rdf = document.findElements('rdf:RDF').firstOrNull;
  if (rss == null && rdf == null) {
    throw ArgumentError('not a rss feed');
  }
  var channelElement = (rss ?? rdf)!.findElements('channel').firstOrNull;
  if (channelElement == null) {
    throw ArgumentError('channel not found');
  }
  return RssFeed(
    title: channelElement.findElements('title').firstOrNull?.innerText,
    author: channelElement.findElements('author').firstOrNull?.innerText,
    description:
        channelElement.findElements('description').firstOrNull?.innerText,
    link: channelElement.findElements('link').firstOrNull?.innerText,
    items: (rdf ?? channelElement)
        .findElements('item')
        .map((e) => RssItem.parse(e))
        .toList(),
    image: (rdf ?? channelElement)
        .findElements('image')
        .map((e) => RssImage.parse(e))
        .firstOrNull,
    cloud: channelElement
        .findElements('cloud')
        .map((e) => RssCloud.parse(e))
        .firstOrNull,
    categories: channelElement
        .findElements('category')
        .map((e) => RssCategory.parse(e))
        .toList(),
    skipDays: channelElement
            .findElements('skipDays')
            .firstOrNull
            ?.findAllElements('day')
            .map((e) => e.innerText)
            .toList() ??
        [],
    skipHours: channelElement
            .findElements('skipHours')
            .firstOrNull
            ?.findAllElements('hour')
            .map((e) => int.tryParse(e.innerText) ?? 0)
            .toList() ??
        [],
    lastBuildDate:
        channelElement.findElements('lastBuildDate').firstOrNull?.innerText,
    language: channelElement.findElements('language').firstOrNull?.innerText,
    generator:
        channelElement.findElements('generator').firstOrNull?.innerText,
    copyright:
        channelElement.findElements('copyright').firstOrNull?.innerText,
    docs: channelElement.findElements('docs').firstOrNull?.innerText,
    managingEditor:
        channelElement.findElements('managingEditor').firstOrNull?.innerText,
    rating: channelElement.findElements('rating').firstOrNull?.innerText,
    webMaster:
        channelElement.findElements('webMaster').firstOrNull?.innerText,
    ttl: int.tryParse(
        channelElement.findElements('ttl').firstOrNull?.innerText ?? '0'),
    dc: DublinCore.parse(channelElement),
    itunes: Itunes.parse(channelElement),
    syndication: Syndication.parse(channelElement),
    podcast: Podcast.parse(channelElement),
  );
}