5 // Jason Diamond (jason@injektilo.org)
6 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
7 // Atsushi Enomoto (ginga@kit.hi-ho.ne.jp)
9 // (C) 2001, 2002 Jason Diamond http://injektilo.org/
10 // (c) 2002 Ximian, Inc. (http://www.ximian.com)
11 // (C) 2003 Atsushi Enomoto
15 // Permission is hereby granted, free of charge, to any person obtaining
16 // a copy of this software and associated documentation files (the
17 // "Software"), to deal in the Software without restriction, including
18 // without limitation the rights to use, copy, modify, merge, publish,
19 // distribute, sublicense, and/or sell copies of the Software, and to
20 // permit persons to whom the Software is furnished to do so, subject to
21 // the following conditions:
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
26 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 using System.Collections;
35 using System.Diagnostics;
38 using System.Xml.Schema; // only required for NET_2_0 (SchemaInfo)
39 using System.Xml.Serialization; // only required for NET_2_0 (SchemaInfo)
40 using Mono.Xml; // only required for NET_2_0
41 using Mono.Xml.Schema; // only required for NET_2_0
46 public abstract class XmlReader : IDisposable
48 public abstract class XmlReader
51 private StringBuilder readStringBuffer;
52 private XmlReaderBinarySupport binary;
54 private XmlReaderSettings settings;
59 protected XmlReader ()
67 public abstract int AttributeCount { get; }
69 public abstract string BaseURI { get; }
71 internal XmlReaderBinarySupport Binary {
72 get { return binary; }
75 internal XmlReaderBinarySupport.CharGetter BinaryCharGetter {
76 get { return binary != null ? binary.Getter : null; }
79 binary = new XmlReaderBinarySupport (this);
80 binary.Getter = value;
85 // To enable it internally in sys.xml, just insert these
86 // two lines into Read():
89 // if (Binary != null)
93 public virtual bool CanReadBinaryContent {
97 public virtual bool CanReadValueChunk {
101 internal virtual bool CanReadBinaryContent {
102 get { return false; }
105 internal virtual bool CanReadValueChunk {
106 get { return false; }
110 public virtual bool CanResolveEntity
112 get { return false; }
115 public abstract int Depth { get; }
117 public abstract bool EOF { get; }
119 public virtual bool HasAttributes
121 get { return AttributeCount > 0; }
124 public abstract bool HasValue { get; }
126 public abstract bool IsEmptyElement { get; }
129 public virtual bool IsDefault {
130 get { return false; }
133 public virtual string this [int i] {
134 get { return GetAttribute (i); }
137 public virtual string this [string name] {
138 get { return GetAttribute (name); }
141 public virtual string this [string name, string namespaceURI] {
142 get { return GetAttribute (name, namespaceURI); }
145 public abstract bool IsDefault { get; }
147 public abstract string this [int i] { get; }
149 public abstract string this [string name] { get; }
151 public abstract string this [string localName, string namespaceName] { get; }
154 public abstract string LocalName { get; }
157 public virtual string Name {
159 return Prefix.Length > 0 ?
160 String.Concat (Prefix, ":", LocalName) :
165 public abstract string Name { get; }
168 public abstract string NamespaceURI { get; }
170 public abstract XmlNameTable NameTable { get; }
172 public abstract XmlNodeType NodeType { get; }
174 public abstract string Prefix { get; }
177 public virtual char QuoteChar {
181 public abstract char QuoteChar { get; }
184 public abstract ReadState ReadState { get; }
187 public virtual IXmlSchemaInfo SchemaInfo {
191 public virtual XmlReaderSettings Settings {
192 get { return settings; }
196 public abstract string Value { get; }
199 public virtual string XmlLang {
200 get { return String.Empty; }
203 public virtual XmlSpace XmlSpace {
204 get { return XmlSpace.None; }
207 public abstract string XmlLang { get; }
209 public abstract XmlSpace XmlSpace { get; }
216 public abstract void Close ();
219 private static XmlNameTable PopulateNameTable (
220 XmlReaderSettings settings)
222 XmlNameTable nameTable = settings.NameTable;
223 if (nameTable == null)
224 nameTable = new NameTable ();
228 private static XmlParserContext PopulateParserContext (
229 XmlReaderSettings settings, string baseUri)
231 XmlNameTable nt = PopulateNameTable (settings);
232 return new XmlParserContext (nt,
233 new XmlNamespaceManager (nt),
238 private static XmlNodeType GetNodeType (
239 XmlReaderSettings settings)
241 ConformanceLevel level = settings != null ? settings.ConformanceLevel : ConformanceLevel.Auto;
243 level == ConformanceLevel.Fragment ?
244 XmlNodeType.Element :
245 XmlNodeType.Document;
248 public static XmlReader Create (Stream stream)
250 return Create (stream, null);
253 public static XmlReader Create (string url)
255 return Create (url, null);
258 public static XmlReader Create (TextReader reader)
260 return Create (reader, null);
263 public static XmlReader Create (string url, XmlReaderSettings settings)
265 return Create (url, settings, null);
268 public static XmlReader Create (Stream stream, XmlReaderSettings settings)
270 return Create (stream, settings, String.Empty);
273 public static XmlReader Create (TextReader reader, XmlReaderSettings settings)
275 return Create (reader, settings, String.Empty);
278 static XmlReaderSettings PopulateSettings (XmlReaderSettings src)
281 return new XmlReaderSettings ();
286 public static XmlReader Create (Stream stream, XmlReaderSettings settings, string baseUri)
288 settings = PopulateSettings (settings);
289 return Create (stream, settings,
290 PopulateParserContext (settings, baseUri));
293 public static XmlReader Create (TextReader reader, XmlReaderSettings settings, string baseUri)
295 settings = PopulateSettings (settings);
296 return Create (reader, settings,
297 PopulateParserContext (settings, baseUri));
300 public static XmlReader Create (XmlReader reader, XmlReaderSettings settings)
302 settings = PopulateSettings (settings);
303 XmlReader r = CreateFilteredXmlReader (reader, settings);
304 r.settings = settings;
308 public static XmlReader Create (string url, XmlReaderSettings settings, XmlParserContext context)
310 settings = PopulateSettings (settings);
312 context = PopulateParserContext (settings, url);
313 XmlTextReader xtr = new XmlTextReader (true, url, GetNodeType (settings), context);
314 XmlReader ret = CreateCustomizedTextReader (xtr, settings);
315 xtr.CloseInput = true;
319 public static XmlReader Create (Stream stream, XmlReaderSettings settings, XmlParserContext context)
321 settings = PopulateSettings (settings);
323 context = PopulateParserContext (settings, String.Empty);
324 return CreateCustomizedTextReader (new XmlTextReader (stream, GetNodeType (settings), context), settings);
327 public static XmlReader Create (TextReader reader, XmlReaderSettings settings, XmlParserContext context)
329 settings = PopulateSettings (settings);
331 context = PopulateParserContext (settings, String.Empty);
332 return CreateCustomizedTextReader (new XmlTextReader (context.BaseURI, reader, GetNodeType (settings), context), settings);
335 private static XmlReader CreateCustomizedTextReader (XmlTextReader reader, XmlReaderSettings settings)
337 reader.XmlResolver = settings.XmlResolver;
338 // Normalization is set true by default.
339 reader.Normalization = true;
341 if (settings.ProhibitDtd)
342 reader.ProhibitDtd = true;
344 if (!settings.CheckCharacters)
345 reader.CharacterChecking = false;
347 // I guess it might be changed in 2.0 RTM to set true
348 // as default, or just disappear. It goes against
349 // XmlTextReader's default usage and users will have
350 // to close input manually (that's annoying). Moreover,
351 // MS XmlTextReader consumes text input more than
352 // actually read and users can acquire those extra
353 // consumption by GetRemainder() that returns different
355 reader.CloseInput = settings.CloseInput;
357 // I would like to support it in detail later;
358 // MSDN description looks source of confusion. We don't
359 // need examples, but precise list of how it works.
360 reader.Conformance = settings.ConformanceLevel;
362 reader.AdjustLineInfoOffset (settings.LineNumberOffset,
363 settings.LinePositionOffset);
365 if (settings.NameTable != null)
366 reader.SetNameTable (settings.NameTable);
368 XmlReader r = CreateFilteredXmlReader (reader, settings);
369 r.settings = settings;
373 private static XmlReader CreateFilteredXmlReader (XmlReader reader, XmlReaderSettings settings)
375 ConformanceLevel conf = ConformanceLevel.Auto;
376 if (reader is XmlTextReader)
377 conf = ((XmlTextReader) reader).Conformance;
378 else if (reader.Settings != null)
379 conf = reader.Settings.ConformanceLevel;
381 conf = settings.ConformanceLevel;
382 if (settings.ConformanceLevel != ConformanceLevel.Auto &&
383 conf != settings.ConformanceLevel)
384 throw new InvalidOperationException (String.Format ("ConformanceLevel cannot be overwritten by a wrapping XmlReader. The source reader has {0}, while {1} is specified.", conf, settings.ConformanceLevel));
385 settings.ConformanceLevel = conf;
387 reader = CreateValidatingXmlReader (reader, settings);
389 if (reader.Settings != null ||
390 settings.IgnoreComments ||
391 settings.IgnoreProcessingInstructions ||
392 settings.IgnoreWhitespace)
393 return new XmlFilterReader (reader, settings);
395 reader.settings = settings;
400 private static XmlReader CreateValidatingXmlReader (XmlReader reader, XmlReaderSettings settings)
402 XmlValidatingReader xvr = null;
403 switch (settings.ValidationType) {
404 // Auto and XDR are obsoleted in 2.0 and therefore ignored.
407 case ValidationType.DTD:
408 xvr = new XmlValidatingReader (reader);
409 xvr.XmlResolver = settings.XmlResolver;
410 xvr.ValidationType = ValidationType.DTD;
412 case ValidationType.Schema:
413 return new XmlSchemaValidatingReader (reader, settings);
416 // Actually I don't think they are treated in DTD validation though...
417 if ((settings.ValidationFlags & XmlSchemaValidationFlags.ProcessIdentityConstraints) == 0)
418 throw new NotImplementedException ();
419 //if ((settings.ValidationFlags & XmlSchemaValidationFlags.ProcessInlineSchema) != 0)
420 // throw new NotImplementedException ();
421 //if ((settings.ValidationFlags & XmlSchemaValidationFlags.ProcessSchemaLocation) != 0)
422 // throw new NotImplementedException ();
423 //if ((settings.ValidationFlags & XmlSchemaValidationFlags.ReportValidationWarnings) == 0)
424 // throw new NotImplementedException ();
426 return xvr != null ? xvr : reader;
431 void IDisposable.Dispose ()
436 protected virtual void Dispose (bool disposing)
438 if (ReadState != ReadState.Closed)
443 public abstract string GetAttribute (int i);
445 public abstract string GetAttribute (string name);
447 public abstract string GetAttribute (
449 string namespaceName);
451 public static bool IsName (string s)
453 return s != null && XmlChar.IsName (s);
456 public static bool IsNameToken (string s)
458 return s != null && XmlChar.IsNmToken (s);
461 public virtual bool IsStartElement ()
463 return (MoveToContent () == XmlNodeType.Element);
466 public virtual bool IsStartElement (string name)
468 if (!IsStartElement ())
471 return (Name == name);
474 public virtual bool IsStartElement (string localName, string namespaceName)
476 if (!IsStartElement ())
479 return (LocalName == localName && NamespaceURI == namespaceName);
482 public abstract string LookupNamespace (string prefix);
485 public virtual void MoveToAttribute (int i)
487 if (i >= AttributeCount)
488 throw new ArgumentOutOfRangeException ();
489 MoveToFirstAttribute ();
490 for (int a = 1; a < i; a++)
491 MoveToNextAttribute ();
494 public abstract void MoveToAttribute (int i);
497 public abstract bool MoveToAttribute (string name);
499 public abstract bool MoveToAttribute (
501 string namespaceName);
503 private bool IsContent (XmlNodeType nodeType)
506 * (non-white space text, CDATA, Element, EndElement, EntityReference, or EndEntity)
509 case XmlNodeType.Text:
511 case XmlNodeType.CDATA:
513 case XmlNodeType.Element:
515 case XmlNodeType.EndElement:
517 case XmlNodeType.EntityReference:
519 case XmlNodeType.EndEntity:
526 public virtual XmlNodeType MoveToContent ()
528 if (NodeType == XmlNodeType.Attribute)
532 if (IsContent (NodeType))
536 return XmlNodeType.None;
539 public abstract bool MoveToElement ();
541 public abstract bool MoveToFirstAttribute ();
543 public abstract bool MoveToNextAttribute ();
545 public abstract bool Read ();
547 public abstract bool ReadAttributeValue ();
549 public virtual string ReadElementString ()
551 if (MoveToContent () != XmlNodeType.Element) {
552 string error = String.Format ("'{0}' is an invalid node type.",
553 NodeType.ToString ());
554 throw XmlError (error);
557 string result = String.Empty;
558 if (!IsEmptyElement) {
560 result = ReadString ();
561 if (NodeType != XmlNodeType.EndElement) {
562 string error = String.Format ("'{0}' is an invalid node type.",
563 NodeType.ToString ());
564 throw XmlError (error);
572 public virtual string ReadElementString (string name)
574 if (MoveToContent () != XmlNodeType.Element) {
575 string error = String.Format ("'{0}' is an invalid node type.",
576 NodeType.ToString ());
577 throw XmlError (error);
581 string error = String.Format ("The {0} tag from namespace {1} is expected.",
583 throw XmlError (error);
586 string result = String.Empty;
587 if (!IsEmptyElement) {
589 result = ReadString ();
590 if (NodeType != XmlNodeType.EndElement) {
591 string error = String.Format ("'{0}' is an invalid node type.",
592 NodeType.ToString ());
593 throw XmlError (error);
601 public virtual string ReadElementString (string localName, string namespaceName)
603 if (MoveToContent () != XmlNodeType.Element) {
604 string error = String.Format ("'{0}' is an invalid node type.",
605 NodeType.ToString ());
606 throw XmlError (error);
609 if (localName != LocalName || NamespaceURI != namespaceName) {
610 string error = String.Format ("The {0} tag from namespace {1} is expected.",
611 LocalName, NamespaceURI);
612 throw XmlError (error);
615 string result = String.Empty;
616 if (!IsEmptyElement) {
618 result = ReadString ();
619 if (NodeType != XmlNodeType.EndElement) {
620 string error = String.Format ("'{0}' is an invalid node type.",
621 NodeType.ToString ());
622 throw XmlError (error);
630 public virtual void ReadEndElement ()
632 if (MoveToContent () != XmlNodeType.EndElement) {
633 string error = String.Format ("'{0}' is an invalid node type.",
634 NodeType.ToString ());
635 throw XmlError (error);
641 public virtual string ReadInnerXml ()
643 if (ReadState != ReadState.Interactive || NodeType == XmlNodeType.EndElement)
646 if (IsEmptyElement) {
650 StringWriter sw = new StringWriter ();
651 XmlTextWriter xtw = new XmlTextWriter (sw);
652 if (NodeType == XmlNodeType.Element) {
653 int startDepth = Depth;
655 while (startDepth < Depth) {
656 if (ReadState != ReadState.Interactive)
657 throw XmlError ("Unexpected end of the XML reader.");
658 xtw.WriteNode (this, false);
660 // reader is now end element, then proceed once more.
664 xtw.WriteNode (this, false);
666 return sw.ToString ();
669 public virtual string ReadOuterXml ()
671 if (ReadState != ReadState.Interactive || NodeType == XmlNodeType.EndElement)
675 case XmlNodeType.Element:
676 case XmlNodeType.Attribute:
677 StringWriter sw = new StringWriter ();
678 XmlTextWriter xtw = new XmlTextWriter (sw);
679 xtw.WriteNode (this, false);
680 return sw.ToString ();
687 public virtual void ReadStartElement ()
689 if (MoveToContent () != XmlNodeType.Element) {
690 string error = String.Format ("'{0}' is an invalid node type.",
691 NodeType.ToString ());
692 throw XmlError (error);
698 public virtual void ReadStartElement (string name)
700 if (MoveToContent () != XmlNodeType.Element) {
701 string error = String.Format ("'{0}' is an invalid node type.",
702 NodeType.ToString ());
703 throw XmlError (error);
707 string error = String.Format ("The {0} tag from namespace {1} is expected.",
709 throw XmlError (error);
715 public virtual void ReadStartElement (string localName, string namespaceName)
717 if (MoveToContent () != XmlNodeType.Element) {
718 string error = String.Format ("'{0}' is an invalid node type.",
719 NodeType.ToString ());
720 throw XmlError (error);
723 if (localName != LocalName || NamespaceURI != namespaceName) {
724 string error = String.Format ("Expecting {0} tag from namespace {1}, got {2} and {3} instead",
725 localName, namespaceName,
726 LocalName, NamespaceURI);
727 throw XmlError (error);
733 public virtual string ReadString ()
735 if (readStringBuffer == null)
736 readStringBuffer = new StringBuilder ();
737 readStringBuffer.Length = 0;
744 case XmlNodeType.Element:
750 case XmlNodeType.Text:
751 case XmlNodeType.CDATA:
752 case XmlNodeType.Whitespace:
753 case XmlNodeType.SignificantWhitespace:
754 readStringBuffer.Append (Value);
760 case XmlNodeType.Text:
761 case XmlNodeType.CDATA:
762 case XmlNodeType.Whitespace:
763 case XmlNodeType.SignificantWhitespace:
766 case XmlNodeType.Text:
767 case XmlNodeType.CDATA:
768 case XmlNodeType.Whitespace:
769 case XmlNodeType.SignificantWhitespace:
770 readStringBuffer.Append (Value);
778 string ret = readStringBuffer.ToString ();
779 readStringBuffer.Length = 0;
784 public virtual Type ValueType {
785 get { return typeof (string); }
788 public virtual bool ReadToDescendant (string name)
790 if (ReadState == ReadState.Initial) {
792 if (IsStartElement (name))
795 if (NodeType != XmlNodeType.Element || IsEmptyElement)
798 for (Read (); depth < Depth; Read ())
799 if (NodeType == XmlNodeType.Element && name == Name)
804 public virtual bool ReadToDescendant (string localName, string namespaceURI)
806 if (ReadState == ReadState.Initial) {
808 if (IsStartElement (localName, namespaceURI))
811 if (NodeType != XmlNodeType.Element || IsEmptyElement)
814 for (Read (); depth < Depth; Read ())
815 if (NodeType == XmlNodeType.Element && localName == LocalName && namespaceURI == NamespaceURI)
820 public virtual bool ReadToFollowing (string name)
823 if (NodeType == XmlNodeType.Element && name == Name)
828 public virtual bool ReadToFollowing (string localName, string namespaceURI)
831 if (NodeType == XmlNodeType.Element && localName == Name && namespaceURI == NamespaceURI)
836 public virtual bool ReadToNextSibling (string name)
838 if (ReadState != ReadState.Interactive)
841 for (Skip (); depth >= Depth; Skip ())
842 if (NodeType == XmlNodeType.Element && name == Name)
847 public virtual bool ReadToNextSibling (string localName, string namespaceURI)
849 if (ReadState != ReadState.Interactive)
852 for (Skip (); depth >= Depth; Skip ())
853 if (NodeType == XmlNodeType.Element && localName == LocalName && namespaceURI == NamespaceURI)
858 public virtual XmlReader ReadSubtree ()
860 return new SubtreeXmlReader (this);
863 private string ReadContentString ()
865 if (NodeType == XmlNodeType.Attribute)
867 return ReadContentString (true);
870 private string ReadContentString (bool isText)
874 case XmlNodeType.Text:
875 case XmlNodeType.SignificantWhitespace:
876 case XmlNodeType.Whitespace:
877 case XmlNodeType.CDATA:
880 throw new InvalidOperationException (String.Format ("Node type {0} is not supported in this operation.{1}", NodeType, GetLocation ()));
884 string value = String.Empty;
887 case XmlNodeType.Element:
890 throw XmlError ("Child element is not expected in this operation.");
891 case XmlNodeType.EndElement:
893 case XmlNodeType.Text:
894 case XmlNodeType.CDATA:
895 case XmlNodeType.SignificantWhitespace:
896 case XmlNodeType.Whitespace:
901 throw XmlError ("Unexpected end of document.");
904 string GetLocation ()
906 IXmlLineInfo li = this as IXmlLineInfo;
907 return li != null && li.HasLineInfo () ?
908 String.Format (" {0} (line {1}, column {2})", BaseURI, li.LineNumber, li.LinePosition) : String.Empty;
912 public virtual object ReadElementContentAsObject ()
914 return ReadElementContentAs (ValueType, null);
918 public virtual object ReadElementContentAsObject (string localName, string namespaceURI)
920 return ReadElementContentAs (ValueType, null, localName, namespaceURI);
924 public virtual object ReadContentAsObject ()
926 return ReadContentAs (ValueType, null);
929 public virtual object ReadElementContentAs (Type type, IXmlNamespaceResolver resolver)
931 bool isEmpty = IsEmptyElement;
933 object obj = ValueAs (isEmpty ? String.Empty : ReadContentString (false), type, resolver);
939 public virtual object ReadElementContentAs (Type type, IXmlNamespaceResolver resolver, string localName, string namespaceURI)
941 ReadStartElement (localName, namespaceURI);
942 object obj = ReadContentAs (type, resolver);
947 public virtual object ReadContentAs (Type type, IXmlNamespaceResolver resolver)
949 return ValueAs (ReadContentString (), type, resolver);
952 private object ValueAs (string text, Type type, IXmlNamespaceResolver resolver)
955 if (type == typeof (object))
957 if (type == typeof (XmlQualifiedName)) {
958 if (resolver != null)
959 return XmlQualifiedName.Parse (text, resolver);
961 return XmlQualifiedName.Parse (text, this);
964 switch (Type.GetTypeCode (type)) {
965 case TypeCode.Boolean:
966 return XQueryConvert.StringToBoolean (text);
967 case TypeCode.DateTime:
968 return XQueryConvert.StringToDateTime (text);
969 case TypeCode.Decimal:
970 return XQueryConvert.StringToDecimal (text);
971 case TypeCode.Double:
972 return XQueryConvert.StringToDouble (text);
974 return XQueryConvert.StringToInt (text);
976 return XQueryConvert.StringToInteger (text);
977 case TypeCode.Single:
978 return XQueryConvert.StringToFloat (text);
979 case TypeCode.String:
982 } catch (Exception ex) {
983 throw XmlError (String.Format ("Current text value '{0}' is not acceptable for specified type '{1}'. {2}", text, type, ex != null ? ex.Message : String.Empty), ex);
985 throw new ArgumentException (String.Format ("Specified type '{0}' is not supported.", type));
988 public virtual bool ReadElementContentAsBoolean ()
991 return XQueryConvert.StringToBoolean (ReadElementContentAsString ());
992 } catch (FormatException ex) {
993 throw XmlError ("Typed value is invalid.", ex);
997 public virtual DateTime ReadElementContentAsDateTime ()
1000 return XQueryConvert.StringToDateTime (ReadElementContentAsString ());
1001 } catch (FormatException ex) {
1002 throw XmlError ("Typed value is invalid.", ex);
1006 public virtual decimal ReadElementContentAsDecimal ()
1009 return XQueryConvert.StringToDecimal (ReadElementContentAsString ());
1010 } catch (FormatException ex) {
1011 throw XmlError ("Typed value is invalid.", ex);
1015 public virtual double ReadElementContentAsDouble ()
1018 return XQueryConvert.StringToDouble (ReadElementContentAsString ());
1019 } catch (FormatException ex) {
1020 throw XmlError ("Typed value is invalid.", ex);
1024 public virtual float ReadElementContentAsFloat ()
1027 return XQueryConvert.StringToFloat (ReadElementContentAsString ());
1028 } catch (FormatException ex) {
1029 throw XmlError ("Typed value is invalid.", ex);
1033 public virtual int ReadElementContentAsInt ()
1036 return XQueryConvert.StringToInt (ReadElementContentAsString ());
1037 } catch (FormatException ex) {
1038 throw XmlError ("Typed value is invalid.", ex);
1042 public virtual long ReadElementContentAsLong ()
1045 return XQueryConvert.StringToInteger (ReadElementContentAsString ());
1046 } catch (FormatException ex) {
1047 throw XmlError ("Typed value is invalid.", ex);
1051 public virtual string ReadElementContentAsString ()
1053 bool isEmpty = IsEmptyElement;
1054 ReadStartElement ();
1056 return String.Empty;
1057 string s = ReadContentString (false);
1062 public virtual bool ReadElementContentAsBoolean (string localName, string namespaceURI)
1065 return XQueryConvert.StringToBoolean (ReadElementContentAsString (localName, namespaceURI));
1066 } catch (FormatException ex) {
1067 throw XmlError ("Typed value is invalid.", ex);
1071 public virtual DateTime ReadElementContentAsDateTime (string localName, string namespaceURI)
1074 return XQueryConvert.StringToDateTime (ReadElementContentAsString (localName, namespaceURI));
1075 } catch (FormatException ex) {
1076 throw XmlError ("Typed value is invalid.", ex);
1080 public virtual decimal ReadElementContentAsDecimal (string localName, string namespaceURI)
1083 return XQueryConvert.StringToDecimal (ReadElementContentAsString (localName, namespaceURI));
1084 } catch (FormatException ex) {
1085 throw XmlError ("Typed value is invalid.", ex);
1089 public virtual double ReadElementContentAsDouble (string localName, string namespaceURI)
1092 return XQueryConvert.StringToDouble (ReadElementContentAsString (localName, namespaceURI));
1093 } catch (FormatException ex) {
1094 throw XmlError ("Typed value is invalid.", ex);
1098 public virtual float ReadElementContentAsFloat (string localName, string namespaceURI)
1101 return XQueryConvert.StringToFloat (ReadElementContentAsString (localName, namespaceURI));
1102 } catch (FormatException ex) {
1103 throw XmlError ("Typed value is invalid.", ex);
1107 public virtual int ReadElementContentAsInt (string localName, string namespaceURI)
1110 return XQueryConvert.StringToInt (ReadElementContentAsString (localName, namespaceURI));
1111 } catch (FormatException ex) {
1112 throw XmlError ("Typed value is invalid.", ex);
1116 public virtual long ReadElementContentAsLong (string localName, string namespaceURI)
1119 return XQueryConvert.StringToInteger (ReadElementContentAsString (localName, namespaceURI));
1120 } catch (FormatException ex) {
1121 throw XmlError ("Typed value is invalid.", ex);
1125 public virtual string ReadElementContentAsString (string localName, string namespaceURI)
1127 ReadStartElement (localName, namespaceURI);
1129 return String.Empty;
1130 string s = ReadContentString (false);
1135 public virtual bool ReadContentAsBoolean ()
1138 return XQueryConvert.StringToBoolean (ReadContentString ());
1139 } catch (FormatException ex) {
1140 throw XmlError ("Typed value is invalid.", ex);
1144 public virtual DateTime ReadContentAsDateTime ()
1147 return XQueryConvert.StringToDateTime (ReadContentString ());
1148 } catch (FormatException ex) {
1149 throw XmlError ("Typed value is invalid.", ex);
1153 public virtual decimal ReadContentAsDecimal ()
1156 return XQueryConvert.StringToDecimal (ReadContentString ());
1157 } catch (FormatException ex) {
1158 throw XmlError ("Typed value is invalid.", ex);
1162 public virtual double ReadContentAsDouble ()
1165 return XQueryConvert.StringToDouble (ReadContentString ());
1166 } catch (FormatException ex) {
1167 throw XmlError ("Typed value is invalid.", ex);
1171 public virtual float ReadContentAsFloat ()
1174 return XQueryConvert.StringToFloat (ReadContentString ());
1175 } catch (FormatException ex) {
1176 throw XmlError ("Typed value is invalid.", ex);
1180 public virtual int ReadContentAsInt ()
1183 return XQueryConvert.StringToInt (ReadContentString ());
1184 } catch (FormatException ex) {
1185 throw XmlError ("Typed value is invalid.", ex);
1189 public virtual long ReadContentAsLong ()
1192 return XQueryConvert.StringToInteger (ReadContentString ());
1193 } catch (FormatException ex) {
1194 throw XmlError ("Typed value is invalid.", ex);
1198 public virtual string ReadContentAsString ()
1200 return ReadContentString ();
1203 public virtual int ReadContentAsBase64 (
1204 byte [] buffer, int offset, int length)
1207 return binary.ReadContentAsBase64 (
1208 buffer, offset, length);
1211 public virtual int ReadContentAsBinHex (
1212 byte [] buffer, int offset, int length)
1215 return binary.ReadContentAsBinHex (
1216 buffer, offset, length);
1219 public virtual int ReadElementContentAsBase64 (
1220 byte [] buffer, int offset, int length)
1223 return binary.ReadElementContentAsBase64 (
1224 buffer, offset, length);
1227 public virtual int ReadElementContentAsBinHex (
1228 byte [] buffer, int offset, int length)
1231 return binary.ReadElementContentAsBinHex (
1232 buffer, offset, length);
1237 public virtual int ReadValueChunk (
1238 char [] buffer, int offset, int length)
1240 internal virtual int ReadValueChunk (
1241 char [] buffer, int offset, int length)
1244 if (!CanReadValueChunk)
1245 throw new NotSupportedException ();
1247 binary = new XmlReaderBinarySupport (this);
1248 return binary.ReadValueChunk (buffer, offset, length);
1251 private void CheckSupport ()
1253 // Default implementation expects both.
1254 if (!CanReadBinaryContent || !CanReadValueChunk)
1255 throw new NotSupportedException ();
1257 binary = new XmlReaderBinarySupport (this);
1260 public abstract void ResolveEntity ();
1262 public virtual void Skip ()
1264 if (ReadState != ReadState.Interactive)
1268 if (NodeType != XmlNodeType.Element || IsEmptyElement) {
1274 while (Read () && depth < Depth)
1276 if (NodeType == XmlNodeType.EndElement)
1280 private XmlException XmlError (string message)
1282 return new XmlException (this as IXmlLineInfo, BaseURI, message);
1285 private XmlException XmlError (string message, Exception innerException)
1287 return new XmlException (this as IXmlLineInfo, BaseURI, message);