2003-03-15 Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
[mono.git] / mcs / class / System.XML / System.Xml / XmlDocument.cs
index 49741c7f1f5750a6d566d02e3c23a4e3fcb26b15..fcf8d9b17b98b2b68f143a51db5e66d43264f648 100644 (file)
@@ -20,6 +20,7 @@ using System.Text;
 using System.Xml.XPath;
 using System.Diagnostics;
 using System.Collections;
+using Mono.Xml.Native;
 
 namespace System.Xml
 {
@@ -558,11 +559,7 @@ namespace System.Xml
 
                public virtual void Load (string filename)
                {
-                       Uri uri = new Uri (filename);
-                       baseURI = filename;     // FIXME: resolve base
-                       Stream stream = new XmlUrlResolver ().GetEntity (uri, null, typeof(Stream)) as Stream;
-                       XmlReader xmlReader = new XmlTextReader (new XmlStreamReader (new XmlInputStream (stream)));
-                       Load (xmlReader);
+                       Load (new XmlTextReader (filename));
                }
 
                public virtual void Load (TextReader txtReader)
@@ -695,26 +692,23 @@ namespace System.Xml
                        XmlNode resultNode = null;
                        XmlNode newNode = null;
                        XmlNode currentNode = null;
+
+                       if (reader.ReadState == ReadState.Initial)
+                               reader.Read ();
+
                        // It was originally XmlDocument.Load(reader reader) when mcs was v0.16.
                        int startDepth = reader.Depth;
-                       bool atStart = true;
+//                     bool atStart = true;
                        bool ignoredWhitespace;
                        bool reachedEOF = false;
 
                        do {
                                ignoredWhitespace = false;
-                               reader.Read ();
                                if (reader.NodeType == XmlNodeType.None)
                                        if (reachedEOF)
                                                throw new Exception ("XML Reader reached to end while reading node.");
                                        else
                                                reachedEOF = true;
-                               // This complicated check is because we shouldn't make
-                               // improper additional XmlReader.Read() by this method itself.
-                               if(atStart && (reader.NodeType == XmlNodeType.EndElement || 
-                                       reader.NodeType == XmlNodeType.EndEntity))
-                                       throw new InvalidOperationException ("the XmlReader now holds invalid position.");
-                               atStart = false;
                                switch (reader.NodeType) {
 
                                case XmlNodeType.Attribute:
@@ -754,7 +748,7 @@ namespace System.Xml
                                        break;
 
                                case XmlNodeType.EndElement:
-                                       if(currentNode.Name != reader.Name)
+                                       if(currentNode == null || currentNode.Name != reader.Name)
                                                throw new XmlException ("mismatch end tag.");
                                        currentNode = currentNode.ParentNode;
                                        break;
@@ -821,12 +815,9 @@ namespace System.Xml
                                                ignoredWhitespace = true;
                                        break;
                                }
-                       } while ((!reader.EOF && ignoredWhitespace) ||
-                               reader.Depth > startDepth || 
-                               // This complicated condition is because reader.Depth was set
-                               // before XmlTextReader.depth increments ;-)
-                               (reader.Depth == startDepth && reader.NodeType == XmlNodeType.Element && reader.IsEmptyElement == false)
-                               );
+                               reader.Read ();
+                       } while (ignoredWhitespace || reader.Depth > startDepth ||
+                               (reader.Depth == startDepth && reader.NodeType == XmlNodeType.EndElement));
                        return resultNode != null ? resultNode : newNode;
                }