浏览代码

2009-10-16 Atsushi Enomoto <[email protected]>

	* 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
Atsushi Eno 16 年之前
父节点
当前提交
68d0bee223

+ 6 - 0
mcs/class/System.ServiceModel.Web/System.ServiceModel.Syndication/ChangeLog

@@ -1,3 +1,9 @@
+2009-10-16  Atsushi Enomoto  <[email protected]>
+
+	* 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  <[email protected]>
 
 	* SyndicationVersions.cs :

+ 3 - 3
mcs/class/System.ServiceModel.Web/System.ServiceModel.Syndication/Rss20FeedFormatter.cs

@@ -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)

+ 26 - 5
mcs/class/System.ServiceModel.Web/System.ServiceModel.Syndication/Rss20ItemFormatter.cs

@@ -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 ... />