Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'mcs/class/System.XML/System.Xml/XmlReader.cs')
-rw-r--r--mcs/class/System.XML/System.Xml/XmlReader.cs203
1 files changed, 168 insertions, 35 deletions
diff --git a/mcs/class/System.XML/System.Xml/XmlReader.cs b/mcs/class/System.XML/System.Xml/XmlReader.cs
index c2cd2f6541a..6e4d243b2f6 100644
--- a/mcs/class/System.XML/System.Xml/XmlReader.cs
+++ b/mcs/class/System.XML/System.Xml/XmlReader.cs
@@ -1,10 +1,12 @@
//
// XmlReader.cs
//
-// Author:
-// Jason Diamond (jason@injektilo.org)
+// Authors:
+// Jason Diamond (jason@injektilo.org)
+// Gonzalo Paniagua Javier (gonzalo@ximian.com)
//
// (C) 2001, 2002 Jason Diamond http://injektilo.org/
+// (c) 2002 Ximian, Inc. (http://www.ximian.com)
//
namespace System.Xml
@@ -130,24 +132,25 @@ namespace System.Xml
return result;
}
- [MonoTODO]
public virtual bool IsStartElement ()
{
- throw new NotImplementedException ();
+ return (MoveToContent () == XmlNodeType.Element);
}
- [MonoTODO]
public virtual bool IsStartElement (string name)
{
- throw new NotImplementedException ();
+ if (!IsStartElement ())
+ return false;
+
+ return (Name == name);
}
- [MonoTODO]
- public virtual bool IsStartElement (
- string localName,
- string namespaceName)
+ public virtual bool IsStartElement (string localName, string namespaceName)
{
- throw new NotImplementedException ();
+ if (!IsStartElement ())
+ return false;
+
+ return (LocalName == localName && NamespaceURI == namespaceName);
}
public abstract string LookupNamespace (string prefix);
@@ -160,10 +163,38 @@ namespace System.Xml
string localName,
string namespaceName);
- [MonoTODO]
+ private bool IsContent (XmlNodeType nodeType)
+ {
+ /* MS doc says:
+ * (non-white space text, CDATA, Element, EndElement, EntityReference, or EndEntity)
+ */
+ switch (nodeType) {
+ case XmlNodeType.Text:
+ return true;
+ case XmlNodeType.CDATA:
+ return true;
+ case XmlNodeType.Element:
+ return true;
+ case XmlNodeType.EndElement:
+ return true;
+ case XmlNodeType.EntityReference:
+ return true;
+ case XmlNodeType.EndEntity:
+ return true;
+ }
+
+ return false;
+ }
+
public virtual XmlNodeType MoveToContent ()
{
- throw new NotImplementedException ();
+ do {
+ XmlNodeType nodeType = NodeType;
+ if (IsContent (nodeType))
+ return nodeType;
+ } while (Read ());
+
+ return XmlNodeType.None;
}
public abstract bool MoveToElement ();
@@ -176,64 +207,166 @@ namespace System.Xml
public abstract bool ReadAttributeValue ();
- [MonoTODO]
public virtual string ReadElementString ()
{
- throw new NotImplementedException ();
+ if (MoveToContent () != XmlNodeType.Element) {
+ string error = String.Format ("'{0}' is an invalid node type.",
+ NodeType.ToString ());
+ throw new XmlException (this as IXmlLineInfo, error);
+ }
+
+ string result = String.Empty;
+ if (!IsEmptyElement) {
+ Read ();
+ result = ReadString ();
+ if (NodeType != XmlNodeType.EndElement) {
+ string error = String.Format ("'{0}' is an invalid node type.",
+ NodeType.ToString ());
+ throw new XmlException (this as IXmlLineInfo, error);
+ }
+ }
+
+ Read ();
+ return result;
}
- [MonoTODO]
public virtual string ReadElementString (string name)
{
- throw new NotImplementedException ();
+ if (MoveToContent () != XmlNodeType.Element) {
+ string error = String.Format ("'{0}' is an invalid node type.",
+ NodeType.ToString ());
+ throw new XmlException (this as IXmlLineInfo, error);
+ }
+
+ if (name != Name) {
+ string error = String.Format ("The {0} tag from namespace {1} is expected.",
+ Name, NamespaceURI);
+ throw new XmlException (this as IXmlLineInfo, error);
+ }
+
+ string result = String.Empty;
+ if (!IsEmptyElement) {
+ Read ();
+ result = ReadString ();
+ if (NodeType != XmlNodeType.EndElement) {
+ string error = String.Format ("'{0}' is an invalid node type.",
+ NodeType.ToString ());
+ throw new XmlException (this as IXmlLineInfo, error);
+ }
+ }
+
+ Read ();
+ return result;
}
- [MonoTODO]
- public virtual string ReadElementString (
- string localName,
- string namespaceName)
+ public virtual string ReadElementString (string localName, string namespaceName)
{
- throw new NotImplementedException ();
+ if (MoveToContent () != XmlNodeType.Element) {
+ string error = String.Format ("'{0}' is an invalid node type.",
+ NodeType.ToString ());
+ throw new XmlException (this as IXmlLineInfo, error);
+ }
+
+ if (localName != LocalName || NamespaceURI != namespaceName) {
+ string error = String.Format ("The {0} tag from namespace {1} is expected.",
+ LocalName, NamespaceURI);
+ throw new XmlException (this as IXmlLineInfo, error);
+ }
+
+ string result = String.Empty;
+ if (!IsEmptyElement) {
+ Read ();
+ result = ReadString ();
+ if (NodeType != XmlNodeType.EndElement) {
+ string error = String.Format ("'{0}' is an invalid node type.",
+ NodeType.ToString ());
+ throw new XmlException (this as IXmlLineInfo, error);
+ }
+ }
+
+ Read ();
+ return result;
}
- [MonoTODO]
public virtual void ReadEndElement ()
{
- throw new NotImplementedException ();
+ if (MoveToContent () != XmlNodeType.EndElement) {
+ string error = String.Format ("'{0}' is an invalid node type.",
+ NodeType.ToString ());
+ throw new XmlException (this as IXmlLineInfo, error);
+ }
+
+ Read ();
}
public abstract string ReadInnerXml ();
public abstract string ReadOuterXml ();
- [MonoTODO]
public virtual void ReadStartElement ()
{
- throw new NotImplementedException ();
+ if (MoveToContent () != XmlNodeType.Element) {
+ string error = String.Format ("'{0}' is an invalid node type.",
+ NodeType.ToString ());
+ throw new XmlException (this as IXmlLineInfo, error);
+ }
+
+ Read ();
}
- [MonoTODO]
public virtual void ReadStartElement (string name)
{
- throw new NotImplementedException ();
+ if (MoveToContent () != XmlNodeType.Element) {
+ string error = String.Format ("'{0}' is an invalid node type.",
+ NodeType.ToString ());
+ throw new XmlException (this as IXmlLineInfo, error);
+ }
+
+ if (name != Name) {
+ string error = String.Format ("The {0} tag from namespace {1} is expected.",
+ Name, NamespaceURI);
+ throw new XmlException (this as IXmlLineInfo, error);
+ }
+
+ Read ();
}
- [MonoTODO]
- public virtual void ReadStartElement (
- string localName,
- string namespaceName)
+ public virtual void ReadStartElement (string localName, string namespaceName)
{
- throw new NotImplementedException ();
+ if (MoveToContent () != XmlNodeType.Element) {
+ string error = String.Format ("'{0}' is an invalid node type.",
+ NodeType.ToString ());
+ throw new XmlException (this as IXmlLineInfo, error);
+ }
+
+ if (localName != LocalName || NamespaceURI != namespaceName) {
+ string error = String.Format ("The {0} tag from namespace {1} is expected.",
+ LocalName, NamespaceURI);
+ throw new XmlException (this as IXmlLineInfo, error);
+ }
+
+ Read ();
}
public abstract string ReadString ();
public abstract void ResolveEntity ();
- [MonoTODO]
public virtual void Skip ()
{
- throw new NotImplementedException ();
+ if (ReadState != ReadState.Interactive)
+ return;
+
+ MoveToElement ();
+ if (NodeType != XmlNodeType.Element || IsEmptyElement) {
+ Read ();
+ return;
+ }
+
+ int depth = Depth;
+ while (Read() && depth < Depth);
+ if (NodeType == XmlNodeType.EndElement)
+ Read ();
}
#endregion