Browse Source

2003-08-24 Atsushi Enomoto <[email protected]>

	* XmlValidatingReader.cs : Implemented SchemaType. Added support for
	  ValidationType.Schema. Added support for XmlResolver. Fixed
	  ReadTypedValue() not to consume EndElement.

svn path=/trunk/mcs/; revision=17561
Atsushi Eno 22 năm trước cách đây
mục cha
commit
4b0fc2dec7

+ 6 - 0
mcs/class/System.XML/System.Xml/ChangeLog

@@ -1,3 +1,9 @@
+2003-08-24  Atsushi Enomoto <[email protected]>
+
+	* XmlValidatingReader.cs : Implemented SchemaType. Added support for
+	  ValidationType.Schema. Added support for XmlResolver. Fixed 
+	  ReadTypedValue() not to consume EndElement.
+
 2003-08-19  Atsushi Enomoto <[email protected]>
 
 	* XmlDocumentNavigator.cs : Fixed MoveToFirstNamespace() that arose

+ 43 - 12
mcs/class/System.XML/System.Xml/XmlValidatingReader.cs

@@ -24,10 +24,12 @@ namespace System.Xml {
 		XmlTextReader xmlTextReader;
 		XmlReader validatingReader;
 		XmlResolver resolver;
+		bool specifiedResolver;
 		ValidationType validationType;
 		XmlSchemaCollection schemas;
 		DTDValidatingReader dtdReader;
 		IHasXmlSchemaInfo schemaInfo;
+		StringBuilder storedCharacters;
 
 		#endregion // Fields
 
@@ -40,6 +42,7 @@ namespace System.Xml {
 			entityHandling = EntityHandling.ExpandEntities;
 			validationType = ValidationType.Auto;
 			schemas = new XmlSchemaCollection ();
+			storedCharacters = new StringBuilder ();
 		}
 
 		public XmlValidatingReader (Stream xmlFragment, XmlNodeType fragType, XmlParserContext context)
@@ -212,8 +215,7 @@ namespace System.Xml {
 		}
 
 		public object SchemaType {
-			[MonoTODO]
-			get { throw new NotImplementedException (); }
+			get { return schemaInfo.SchemaType; }
 		}
 
 		[MonoTODO]
@@ -226,9 +228,9 @@ namespace System.Xml {
 				case ValidationType.Auto:
 				case ValidationType.DTD:
 				case ValidationType.None:
+				case ValidationType.Schema:
 					validationType = value; 
 					break;
-				case ValidationType.Schema:
 				case ValidationType.XDR:
 					throw new NotImplementedException ();
 				}
@@ -244,12 +246,12 @@ namespace System.Xml {
 		}
 
 		public XmlResolver XmlResolver {
-			[MonoTODO]
 			set {
+				specifiedResolver = true;
 				resolver = value;
-//				XmlSchemaValidatingReader xsvr = validatingReader as XmlSchemaValidatingReader;
-//				if (xsvr != null)
-//					xsvr.XmlResolver = value;
+				XsdValidatingReader xsvr = validatingReader as XsdValidatingReader;
+				if (xsvr != null)
+					xsvr.XmlResolver = value;
 				DTDValidatingReader dvr = validatingReader as DTDValidatingReader;
 				if (dvr != null)
 					dvr.XmlResolver = value;
@@ -364,14 +366,24 @@ namespace System.Xml {
 						goto case ValidationType.DTD;
 				case ValidationType.DTD:
 					validatingReader = dtdReader = new DTDValidatingReader (sourceReader, this);
+					if (specifiedResolver)
+						dtdReader.XmlResolver = resolver;
 					break;
 				case ValidationType.Schema:
-//					dtdReader = new DTDValidatingReader (sourceReader, this);
-//					validatingReader = new XmlSchemaValidatingReader (dtdReader, this);
-//					break;
+					dtdReader = new DTDValidatingReader (sourceReader, this);
+					XsdValidatingReader xsvr = new XsdValidatingReader (dtdReader, this);
+					foreach (XmlSchema schema in Schemas)
+						xsvr.Schemas.Add (schema);
+					validatingReader = xsvr;
+					if (specifiedResolver) {
+						xsvr.XmlResolver = resolver;
+						dtdReader.XmlResolver = resolver;
+					}
+					break;
 				case ValidationType.XDR:
 					throw new NotImplementedException ();
 				}
+				schemaInfo = validatingReader as IHasXmlSchemaInfo;
 			}
 			return validatingReader.Read ();
 		}
@@ -416,7 +428,6 @@ namespace System.Xml {
 		}
 #endif
 
-		[MonoTODO]
 		public object ReadTypedValue ()
 		{
 			if (dtdReader == null)
@@ -426,7 +437,27 @@ namespace System.Xml {
 				return null;
 			switch (NodeType) {
 			case XmlNodeType.Element:
-				return dt.ParseValue (ReadString (), NameTable, dtdReader.ParserContext.NamespaceManager);
+				if (IsEmptyElement)
+					return null;
+
+				storedCharacters.Length = 0;
+				bool loop = true;
+				do {
+					Read ();
+					switch (NodeType) {
+					case XmlNodeType.SignificantWhitespace:
+					case XmlNodeType.Text:
+					case XmlNodeType.CDATA:
+						storedCharacters.Append (Value);
+						break;
+					case XmlNodeType.Comment:
+						break;
+					default:
+						loop = false;
+						break;
+					}
+				} while (loop && !EOF);
+				return dt.ParseValue (storedCharacters.ToString (), NameTable, dtdReader.ParserContext.NamespaceManager);
 			case XmlNodeType.Attribute:
 				return dt.ParseValue (Value, NameTable, dtdReader.ParserContext.NamespaceManager);
 			}