| @@ -41,7 +41,7 @@ class AtomFeed { | |||||
| factory AtomFeed.parse(String xmlString) { | factory AtomFeed.parse(String xmlString) { | ||||
| var document = XmlDocument.parse(xmlString); | var document = XmlDocument.parse(xmlString); | ||||
| var feedElement = findFirstElement(document, 'feed', recursive: true); | |||||
| var feedElement = findFirstElement(document, 'feed'); | |||||
| if (feedElement == null) { | if (feedElement == null) { | ||||
| throw ArgumentError('feed not found'); | throw ArgumentError('feed not found'); | ||||
| } | } | ||||
| @@ -59,7 +59,12 @@ class RssFeed { | |||||
| factory RssFeed.parse(String xmlString) { | factory RssFeed.parse(String xmlString) { | ||||
| var document = XmlDocument.parse(xmlString); | var document = XmlDocument.parse(xmlString); | ||||
| var channelElement = findFirstElement(document, 'channel', recursive: true); | |||||
| var rss = findFirstElement(document, 'rss'); | |||||
| var rdf = findFirstElement(document, 'rdf:RDF'); | |||||
| if (rss == null && rdf == null) { | |||||
| throw ArgumentError('not a rss feed'); | |||||
| } | |||||
| var channelElement = findFirstElement(rss ?? rdf, 'channel'); | |||||
| if (channelElement == null) { | if (channelElement == null) { | ||||
| throw ArgumentError('channel not found'); | throw ArgumentError('channel not found'); | ||||
| } | } | ||||
| @@ -68,11 +73,12 @@ class RssFeed { | |||||
| author: findFirstElement(channelElement, 'author')?.text, | author: findFirstElement(channelElement, 'author')?.text, | ||||
| description: findFirstElement(channelElement, 'description')?.text, | description: findFirstElement(channelElement, 'description')?.text, | ||||
| link: findFirstElement(channelElement, 'link')?.text, | link: findFirstElement(channelElement, 'link')?.text, | ||||
| items: channelElement | |||||
| items: (rss != null ? channelElement : rdf) | |||||
| .findElements('item') | .findElements('item') | ||||
| .map((e) => RssItem.parse(e)) | .map((e) => RssItem.parse(e)) | ||||
| .toList(), | .toList(), | ||||
| image: RssImage.parse(findFirstElement(channelElement, 'image')), | |||||
| image: RssImage.parse( | |||||
| findFirstElement(rss != null ? channelElement : rdf, 'image')), | |||||
| cloud: RssCloud.parse(findFirstElement(channelElement, 'cloud')), | cloud: RssCloud.parse(findFirstElement(channelElement, 'cloud')), | ||||
| categories: channelElement | categories: channelElement | ||||
| .findElements('category') | .findElements('category') | ||||
| @@ -369,4 +369,20 @@ void main() { | |||||
| expect(item.itunes.title, 'awesome title'); | expect(item.itunes.title, 'awesome title'); | ||||
| expect(item.itunes.block, false); | expect(item.itunes.block, false); | ||||
| }); | }); | ||||
| test('parse RSS-RDF.xml', () { | |||||
| var xmlString = File('test/xml/RSS-RDF.xml').readAsStringSync(); | |||||
| var feed = RssFeed.parse(xmlString); | |||||
| expect(feed.title, 'Mozilla Dot Org'); | |||||
| expect(feed.link, 'http://www.mozilla.org'); | |||||
| expect(feed.description, 'the Mozilla Organization web site'); | |||||
| expect(feed.image.title, 'Mozilla'); | |||||
| expect(feed.image.url, 'http://www.mozilla.org/images/moz.gif'); | |||||
| expect(feed.image.link, 'http://www.mozilla.org'); | |||||
| expect(feed.items.length, 5); | |||||
| expect(feed.items.first.title, 'New Status Updates'); | |||||
| expect(feed.items.first.link, 'http://www.mozilla.org/status/'); | |||||
| }); | |||||
| } | } | ||||
| @@ -0,0 +1,35 @@ | |||||
| <?xml version="1.0"?> | |||||
| <rdf:RDF | |||||
| xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||||
| xmlns="http://channel.netscape.com/rdf/simple/0.9/"> | |||||
| <channel> | |||||
| <title>Mozilla Dot Org</title> | |||||
| <link>http://www.mozilla.org</link> | |||||
| <description>the Mozilla Organization web site</description> | |||||
| </channel> | |||||
| <image> | |||||
| <title>Mozilla</title> | |||||
| <url>http://www.mozilla.org/images/moz.gif</url> | |||||
| <link>http://www.mozilla.org</link> | |||||
| </image> | |||||
| <item> | |||||
| <title>New Status Updates</title> | |||||
| <link>http://www.mozilla.org/status/</link> | |||||
| </item> | |||||
| <item> | |||||
| <title>Bugzilla Reorganized</title> | |||||
| <link>http://www.mozilla.org/bugs/</link> | |||||
| </item> | |||||
| <item> | |||||
| <title>Mozilla Party, 2.0!</title> | |||||
| <link>http://www.mozilla.org/party/1999/</link> | |||||
| </item> | |||||
| <item> | |||||
| <title>Unix Platform Parity</title> | |||||
| <link>http://www.mozilla.org/build/unix.html</link> | |||||
| </item> | |||||
| <item> | |||||
| <title>NPL 1.0M published</title> | |||||
| <link>http://www.mozilla.org/NPL/NPL-1.0M.html</link> | |||||
| </item> | |||||
| </rdf:RDF> | |||||