2009-10-16 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Fri, 16 Oct 2009 03:48:53 +0000 (03:48 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Fri, 16 Oct 2009 03:48:53 +0000 (03:48 -0000)
* Rss20FeedFormatter.cs, Rss20ItemFormatter.cs : handle other text
  nodes than text (cdata, whitespaces etc.) and make sure to proceed
  the reader when they are skipped. Fixed bug #546965 and #546959.

svn path=/trunk/mcs/; revision=144249

mcs/class/System.ServiceModel.Web/System.ServiceModel.Syndication/ChangeLog
mcs/class/System.ServiceModel.Web/System.ServiceModel.Syndication/Rss20FeedFormatter.cs
mcs/class/System.ServiceModel.Web/System.ServiceModel.Syndication/Rss20ItemFormatter.cs

index 4e78c64bafd8e1c6156efaf13bcbc82750bc09b4..62317549c3f87320352ce1529b60f3f4840aac4b 100644 (file)
@@ -1,3 +1,9 @@
+2009-10-16  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * Rss20FeedFormatter.cs, Rss20ItemFormatter.cs : handle other text
+         nodes than text (cdata, whitespaces etc.) and make sure to proceed
+         the reader when they are skipped. Fixed bug #546965 and #546959.
+
 2009-10-07  Atsushi Enomoto  <atsushi@ximian.com>
 
        * SyndicationVersions.cs :
index a7b020af37ad81c215c4f331ae933a8c9f8ce070..29497ce47eb6c77892f7e6996413bdd65ee7ffe7 100644 (file)
@@ -305,7 +305,7 @@ namespace System.ServiceModel.Syndication
                        if (!reader.IsEmptyElement) {
                                reader.Read ();
                                for (reader.MoveToContent (); reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
-                                       if (reader.NodeType == XmlNodeType.Text)
+                                       if (reader.IsTextNode ())
                                                category.Name += reader.Value;
                                        else if (!TryParseElement (reader, category, Version)) {
                                                if (PreserveElementExtensions)
@@ -336,7 +336,7 @@ namespace System.ServiceModel.Syndication
                                string url = null;
                                reader.Read ();
                                for (reader.MoveToContent (); reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
-                                       if (reader.NodeType == XmlNodeType.Text)
+                                       if (reader.IsTextNode ())
                                                url += reader.Value;
                                        else if (!TryParseElement (reader, link, Version)) {
                                                if (PreserveElementExtensions)
@@ -367,7 +367,7 @@ namespace System.ServiceModel.Syndication
                        if (!reader.IsEmptyElement) {
                                reader.Read ();
                                for (reader.MoveToContent (); reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
-                                       if (reader.NodeType == XmlNodeType.Text)
+                                       if (reader.IsTextNode ())
                                                person.Email += reader.Value;
                                        else if (!TryParseElement (reader, person, Version)) {
                                                if (PreserveElementExtensions)
index fdabd94ac5c5176e3211a205cf2b68e558da566a..a1c4ba651b6e7dbbde7d7b10f077129215b1f477 100644 (file)
@@ -30,6 +30,7 @@ using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.Globalization;
 using System.IO;
+using System.Linq;
 using System.Runtime.Serialization;
 using System.Text;
 using System.Xml;
@@ -38,6 +39,21 @@ using System.Xml.Serialization;
 
 namespace System.ServiceModel.Syndication
 {
+       static class XmlReaderExtensions
+       {
+               public static bool IsTextNode (this XmlReader r)
+               {
+                       switch (r.NodeType) {
+                       case XmlNodeType.Text:
+                       case XmlNodeType.CDATA:
+                       case XmlNodeType.Whitespace:
+                       case XmlNodeType.SignificantWhitespace:
+                               return true;
+                       }
+                       return false;
+               }
+       }
+
        [XmlRoot ("item", Namespace = "")]
        public class Rss20ItemFormatter : SyndicationItemFormatter, IXmlSerializable
        {
@@ -285,7 +301,7 @@ namespace System.ServiceModel.Syndication
                        if (!reader.IsEmptyElement) {
                                reader.Read ();
                                for (reader.MoveToContent (); reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
-                                       if (reader.NodeType == XmlNodeType.Text)
+                                       if (reader.IsTextNode ())
                                                category.Name += reader.Value;
                                        else if (!TryParseElement (reader, category, Version)) {
                                                if (PreserveElementExtensions)
@@ -294,6 +310,7 @@ namespace System.ServiceModel.Syndication
                                                else
                                                        reader.Skip ();
                                        }
+                                       reader.Read ();
                                }
                        }
                        reader.Read (); // </category> or <category ... />
@@ -362,7 +379,7 @@ namespace System.ServiceModel.Syndication
                                string url = null;
                                reader.Read ();
                                for (reader.MoveToContent (); reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
-                                       if (reader.NodeType == XmlNodeType.Text)
+                                       if (reader.IsTextNode ())
                                                url += reader.Value;
                                        else if (!TryParseElement (reader, link, Version)) {
                                                if (PreserveElementExtensions)
@@ -393,7 +410,7 @@ namespace System.ServiceModel.Syndication
                        if (!reader.IsEmptyElement) {
                                reader.Read ();
                                for (reader.MoveToContent (); reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
-                                       if (reader.NodeType == XmlNodeType.Text)
+                                       if (reader.IsTextNode ())
                                                person.Email += reader.Value;
                                        else if (!TryParseElement (reader, person, Version)) {
                                                if (PreserveElementExtensions)
@@ -402,6 +419,7 @@ namespace System.ServiceModel.Syndication
                                                else
                                                        reader.Skip ();
                                        }
+                                       reader.Read ();
                                }
                        }
                        reader.Read (); // end element or empty element
@@ -468,9 +486,12 @@ namespace System.ServiceModel.Syndication
                        if (!reader.IsEmptyElement) {
                                reader.Read ();
                                string title = null;
-                               while (reader.NodeType != XmlNodeType.EndElement)
-                                       if (reader.NodeType == XmlNodeType.Text)
+                               while (reader.NodeType != XmlNodeType.EndElement) {
+                                       if (reader.IsTextNode ())
                                                title += reader.Value;
+                                       reader.Skip ();
+                                       reader.MoveToContent ();
+                               }
                                feed.Title = new TextSyndicationContent (title);
                        }
                        reader.Read (); // </source> or <source ... />