2003-10-25 Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
[mono.git] / mcs / class / System.XML / System.Xml / XmlNodeReader.cs
index 9376b579793319b1d111d6f594f93b3dd0315b52..23c6f1219a7d33b40a18a1a8421c3dbcbfbff66e 100755 (executable)
@@ -35,7 +35,10 @@ namespace System.Xml
                        get {
                                if (current.ParentNode != null && current.ParentNode.NodeType == XmlNodeType.Attribute)
                                        return ((XmlAttribute) current.ParentNode).OwnerElement;
-                               return (current.NodeType == XmlNodeType.Attribute) ? ((XmlAttribute)current).OwnerElement : current;
+                               else if (current.NodeType == XmlNodeType.Attribute) 
+                                       return ((XmlAttribute) current).OwnerElement;
+                               else
+                                       return current;
                        }
                }
 
@@ -64,9 +67,10 @@ namespace System.Xml
                                        return entityReader.ReadState == ReadState.Interactive ?
                                                entityReader.AttributeCount : 0;
 
-                               if (isEndElement || current == null || current.Attributes == null)
+                               if (isEndElement || current == null)
                                        return 0;
-                               return ownerElement.Attributes.Count;
+                               XmlNode n = ownerElement;
+                               return n.Attributes != null ? n.Attributes.Count : 0;
                        }
                }
 
@@ -92,6 +96,13 @@ namespace System.Xml
                                if (entityReader != null && entityReader.ReadState == ReadState.Interactive)
                                        return entityReader.Depth + depth + entityReaderStack.Count + 1;
 
+                               if (current == null)
+                                       return 0;
+                               if (current.NodeType == XmlNodeType.Attribute)
+                                       return depth + 1;
+                               if (current.ParentNode != null && current.ParentNode.NodeType == XmlNodeType.Attribute)
+                                       return depth + 2;
+
                                return depth;
                        }
                }
@@ -112,8 +123,12 @@ namespace System.Xml
                                if (isEndElement || current == null)
                                        return false;
 
-                               if (current.Attributes == null ||
-                                       current.Attributes.Count == 0)
+                               // MS BUG: inconsistent return value between XmlTextReader and XmlNodeReader.
+                               // As for attribute and its descendants, XmlReader returns element's HasAttributes.
+                               XmlNode n = ownerElement;
+
+                               if (n.Attributes == null ||
+                                       n.Attributes.Count == 0)
                                        return false;
                                else
                                        return true;
@@ -129,16 +144,18 @@ namespace System.Xml
                                if (current == null)
                                        return false;
 
-                               if (current.NodeType == XmlNodeType.Element ||
-                                   current.NodeType == XmlNodeType.EntityReference ||
-                                   current.NodeType == XmlNodeType.Document ||
-                                   current.NodeType == XmlNodeType.DocumentFragment ||
-                                   current.NodeType == XmlNodeType.Notation ||
-                                   current.NodeType == XmlNodeType.EndElement ||
-                                   current.NodeType == XmlNodeType.EndEntity)
+                               switch (current.NodeType) {
+                               case XmlNodeType.Element:
+                               case XmlNodeType.EntityReference:
+                               case XmlNodeType.Document:
+                               case XmlNodeType.DocumentFragment:
+                               case XmlNodeType.Notation:
+                               case XmlNodeType.EndElement:
+                               case XmlNodeType.EndEntity:
                                        return false;
-                               else
+                               default:
                                        return true;
+                               }
                        }
                              
                }
@@ -276,7 +293,10 @@ namespace System.Xml
                                if (current == null)
                                        return String.Empty;
 
-                               return current.Prefix;
+//                             if (current.NodeType == XmlNodeType.Attribute)
+//                                     return current.Prefix != String.Empty ? current.Prefix : null;
+//                             else
+                                       return current.Prefix;
                        }
                }
 
@@ -476,6 +496,17 @@ namespace System.Xml
                        return null;
                }
 
+               internal XmlParserContext GetInternalParserContext ()
+               {
+                       if (entityReader != null)
+                               return entityReader.GetInternalParserContext ();
+                       else
+                               return new XmlParserContext (document.NameTable,
+                                       current.ConstructNamespaceManager (),
+                                       document.DocumentType != null ? document.DocumentType.DTD : null,
+                                       current.BaseURI, XmlLang, XmlSpace, Encoding.Unicode);
+               }
+
                public override string LookupNamespace (string prefix)
                {
                        if (entityReader != null && entityReader.ReadState != ReadState.Initial)
@@ -586,8 +617,10 @@ namespace System.Xml
 
                        if (current == null)
                                return false;
-                       if (current.NodeType == XmlNodeType.Attribute) {
-                               current = ((XmlAttribute) current).OwnerElement;
+                       XmlNode n = ownerElement;
+                       if (current != n) {
+//                     if (current.NodeType == XmlNodeType.Attribute) {
+                               current = n;//((XmlAttribute) current).OwnerElement;
                                return true;
                        } else 
                                return false;
@@ -770,8 +803,10 @@ namespace System.Xml
                        }
 
                        if (current.NodeType == XmlNodeType.Attribute) {
+                               if (current.FirstChild == null)
+                                       return false;
                                current = current.FirstChild;
-                               return current != null;
+                               return true;
                        } else if (current.ParentNode.NodeType == XmlNodeType.Attribute) {
                                if (current.NextSibling == null)
                                        return false;
@@ -781,6 +816,7 @@ namespace System.Xml
                                return false;
                }
 
+#if NET_1_0
                // Its traversal behavior is almost same as Read().
                public override string ReadInnerXml ()
                {
@@ -858,6 +894,7 @@ namespace System.Xml
                                return String.Empty;
                        }
                }
+#endif
 
                public override string ReadString ()
                {
@@ -887,10 +924,12 @@ namespace System.Xml
                        if (ctx == null) {
                                ctx = new XmlParserContext (document.NameTable,
                                        current.ConstructNamespaceManager (),
-                                       document.DocumentType.DTD,
+                                       document.DocumentType != null ? document.DocumentType.DTD : null,
                                        BaseURI, XmlLang, XmlSpace, Encoding.Unicode);
                        }
                        entityReader = new XmlTextReader (replacementText, xmlReaderNodeType, ctx);
+                       entityReader.XmlResolver = document.Resolver;
+                       entityReader.SkipTextDeclaration ();
                }
 
                public override void Skip ()