2 // System.Xml.XmlValidatingReader.cs
5 // Tim Coleman (tim@timcoleman.com)
6 // Atsushi Enomoto (ginga@kit.hi-ho.ne.jp)
8 // Copyright (C) Tim Coleman, 2002
9 // (C)2003 Atsushi Enomoto
14 using System.Xml.Schema;
17 namespace System.Xml {
18 public class XmlValidatingReader : XmlReader, IXmlLineInfo {
22 EntityHandling entityHandling;
23 XmlReader sourceReader;
24 XmlReader validatingReader;
26 ValidationType validationType;
33 public XmlValidatingReader (XmlReader reader)
36 this.sourceReader = reader;
37 entityHandling = EntityHandling.ExpandEntities;
38 validationType = ValidationType.Auto;
41 public XmlValidatingReader (Stream xmlFragment, XmlNodeType fragType, XmlParserContext context)
42 : this (new XmlTextReader (xmlFragment, fragType, context))
46 public XmlValidatingReader (string xmlFragment, XmlNodeType fragType, XmlParserContext context)
47 : this (new XmlTextReader (xmlFragment, fragType, context))
51 #endregion // Constructors
55 public override int AttributeCount {
57 get { return validatingReader == null ? 0 : validatingReader.AttributeCount; }
60 public override string BaseURI {
62 get { return validatingReader == null ? String.Empty : validatingReader.BaseURI; }
65 public override bool CanResolveEntity {
66 get { return validatingReader == null ? false : validatingReader.CanResolveEntity; }
69 public override int Depth {
71 get { return validatingReader == null ? 0 : validatingReader.Depth; }
74 public Encoding Encoding {
76 get { throw new NotImplementedException (); }
80 public EntityHandling EntityHandling {
81 get { return entityHandling; }
82 set { entityHandling = value; }
85 public override bool EOF {
87 get { return validatingReader == null ? false : validatingReader.EOF; }
90 public override bool HasValue {
92 get { return validatingReader == null ? false : validatingReader.HasValue; }
95 public override bool IsDefault {
97 get { return validatingReader == null ? false : validatingReader.IsDefault; }
100 public override bool IsEmptyElement {
102 get { return validatingReader == null ? false : validatingReader.IsEmptyElement; }
105 public override string this [int i] {
107 get { return validatingReader [i]; }
110 public override string this [string name] {
112 get { return validatingReader == null ? String.Empty : validatingReader [name]; }
115 public override string this [string localName, string namespaceName] {
117 get { return validatingReader == null ? String.Empty : validatingReader [localName, namespaceName]; }
120 int IXmlLineInfo.LineNumber {
122 IXmlLineInfo info = validatingReader as IXmlLineInfo;
123 return info != null ? info.LineNumber : 0;
127 int IXmlLineInfo.LinePosition {
129 IXmlLineInfo info = validatingReader as IXmlLineInfo;
130 return info != null ? info.LinePosition : 0;
134 public override string LocalName {
136 get { return validatingReader == null ? String.Empty : validatingReader.LocalName; }
139 public override string Name {
141 get { return validatingReader == null ? String.Empty : validatingReader.Name; }
145 public bool Namespaces {
147 XmlTextReader xtr = sourceReader as XmlTextReader;
149 return xtr.Namespaces;
151 throw new NotImplementedException ();
154 XmlTextReader xtr = sourceReader as XmlTextReader;
156 xtr.Namespaces = value;
158 throw new NotImplementedException ();
162 public override string NamespaceURI {
164 get { return validatingReader == null ? String.Empty : validatingReader.NamespaceURI; }
167 public override XmlNameTable NameTable {
169 get { return validatingReader == null ? null : validatingReader.NameTable; }
172 public override XmlNodeType NodeType {
174 get { return validatingReader == null ? XmlNodeType.None : validatingReader.NodeType; }
177 public override string Prefix {
179 get { return validatingReader == null ? String.Empty : validatingReader.Prefix; }
182 public override char QuoteChar {
184 get { return validatingReader == null ? '"' : validatingReader.QuoteChar; }
187 [MonoTODO ("confirm which reader should be returned.")]
188 public XmlReader Reader {
189 get { return sourceReader; }
192 public override ReadState ReadState {
195 if (validatingReader == null)
196 return ReadState.Initial;
197 return validatingReader.ReadState;
201 public XmlSchemaCollection Schemas {
203 get { throw new NotImplementedException (); }
206 public object SchemaType {
208 get { throw new NotImplementedException (); }
212 public ValidationType ValidationType {
213 get { return validationType; }
215 if (ReadState != ReadState.Initial)
216 throw new InvalidOperationException ("ValidationType cannot be set after the first call to Read method.");
217 switch (validationType) {
218 case ValidationType.Auto:
219 case ValidationType.DTD:
220 case ValidationType.None:
221 validationType = value;
223 case ValidationType.Schema:
224 case ValidationType.XDR:
225 throw new NotImplementedException ();
230 public override string Value {
232 get { return validatingReader == null ? String.Empty : validatingReader.Value; }
235 public override string XmlLang {
237 get { return validatingReader == null ? String.Empty : validatingReader.XmlLang; }
240 public XmlResolver XmlResolver {
242 set { resolver = value; }
245 public override XmlSpace XmlSpace {
247 get { return validatingReader == null ? XmlSpace.None : validatingReader.XmlSpace; }
250 #endregion // Properties
255 public override void Close ()
257 validatingReader.Close ();
261 public override string GetAttribute (int i)
263 return validatingReader.GetAttribute (i);
267 public override string GetAttribute (string name)
269 return validatingReader.GetAttribute (name);
273 public override string GetAttribute (string localName, string namespaceName)
275 return validatingReader.GetAttribute (localName, namespaceName);
278 bool IXmlLineInfo.HasLineInfo ()
280 IXmlLineInfo info = validatingReader as IXmlLineInfo;
281 return info != null ? info.HasLineInfo () : false;
285 public override string LookupNamespace (string prefix)
287 return validatingReader.LookupNamespace (prefix);
291 public override void MoveToAttribute (int i)
293 validatingReader.MoveToAttribute (i);
297 public override bool MoveToAttribute (string name)
299 return validatingReader.MoveToAttribute (name);
303 public override bool MoveToAttribute (string localName, string namespaceName)
305 return validatingReader.MoveToAttribute (localName, namespaceName);
309 public override bool MoveToElement ()
311 return validatingReader.MoveToElement ();
315 public override bool MoveToFirstAttribute ()
317 return validatingReader.MoveToFirstAttribute ();
321 public override bool MoveToNextAttribute ()
323 return validatingReader.MoveToNextAttribute ();
327 public override bool Read ()
329 if (ReadState == ReadState.Initial) {
330 switch (ValidationType) {
331 case ValidationType.Auto:
332 case ValidationType.None:
333 validatingReader = // new XmlSchemaValidatingReader (
334 new DTDValidatingReader (sourceReader, this);
336 case ValidationType.DTD:
337 validatingReader = new DTDValidatingReader (sourceReader, this);
339 case ValidationType.Schema:
340 // validatingReader = new XmlSchemaValidatingReader (sourceReader, this);
342 case ValidationType.XDR:
343 throw new NotImplementedException ();
346 return validatingReader.Read ();
350 public override bool ReadAttributeValue ()
352 return validatingReader.ReadAttributeValue ();
357 public override string ReadInnerXml ()
359 return validatingReader.ReadInnerXml ();
363 public override string ReadOuterXml ()
365 return validatingReader.ReadOuterXml ();
370 public override string ReadString ()
372 return validatingReader.ReadString ();
376 public object ReadTypedValue ()
378 throw new NotImplementedException ();
381 public override void ResolveEntity ()
383 validatingReader.ResolveEntity ();
386 // It should be "protected" as usual "event model"
387 // methods are, but validation event is not exposed,
388 // so it is no other way to make it "internal".
389 internal void OnValidationEvent (object o, ValidationEventArgs e)
391 if (ValidationEventHandler != null)
392 ValidationEventHandler (o, e);
393 else if (ValidationType != ValidationType.None)
396 #endregion // Methods
398 #region Events and Delegates
400 public event ValidationEventHandler ValidationEventHandler;
402 #endregion // Events and Delegates