2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / System.XML / System.Xml / XmlDocument.cs
index 450742fda65ae9c65a998e4c0c7782d9621460b8..375e8a0eb716bef03a721e22c7e83e2b3a1a722e 100644 (file)
@@ -43,6 +43,10 @@ using System.Xml.XPath;
 using System.Diagnostics;
 using System.Collections;
 using Mono.Xml;
+#if NET_2_0
+using System.Xml.Schema;
+using Mono.Xml.XPath;
+#endif
 
 namespace System.Xml
 {
@@ -56,6 +60,10 @@ namespace System.Xml
                bool preserveWhitespace = false;
                XmlResolver resolver;
                Hashtable idTable = new Hashtable ();
+               XmlNameEntryCache nameCache = new XmlNameEntryCache ();
+#if NET_2_0
+               XmlSchemaSet schemas;
+#endif
 
                // MS.NET rejects undeclared entities _only_ during Load(),
                // while ReadNode() never rejects such node. So it signs
@@ -174,6 +182,10 @@ namespace System.Xml
                        get { return "#document"; }
                }
 
+               internal XmlNameEntryCache NameCache {
+                       get { return nameCache; }
+               }
+
                public XmlNameTable NameTable {
                        get { return nameTable; }
                }
@@ -226,6 +238,13 @@ namespace System.Xml
                        }
                }
 
+#if NET_2_0
+               public XmlSchemaSet Schemas {
+                       get { return schemas; }
+                       set { schemas = value; }
+               }
+#endif
+
                #endregion
 
                #region Methods
@@ -356,7 +375,11 @@ namespace System.Xml
 
                protected internal virtual XPathNavigator CreateNavigator (XmlNode node)
                {
+#if NET_2_0
+                       return new XPathEditableDocument (node).CreateNavigator ();
+#else
                        return new XmlDocumentNavigator (node);
+#endif
                }
 
                public virtual XmlNode CreateNode (
@@ -584,7 +607,7 @@ namespace System.Xml
 
                public virtual void Load (Stream inStream)
                {
-                       XmlTextReader reader = new XmlTextReader (inStream);
+                       XmlTextReader reader = new XmlTextReader (inStream, NameTable);
                        reader.XmlResolver = resolver;
                        Load (reader);
                }
@@ -593,7 +616,7 @@ namespace System.Xml
                {
                        XmlTextReader xr = null;
                        try {
-                               xr = new XmlTextReader (filename);
+                               xr = new XmlTextReader (filename, NameTable);
                                xr.XmlResolver = resolver;
                                Load (xr);
                        } finally {
@@ -604,7 +627,7 @@ namespace System.Xml
 
                public virtual void Load (TextReader txtReader)
                {
-                       XmlTextReader xr = new XmlTextReader (txtReader);
+                       XmlTextReader xr = new XmlTextReader (txtReader, NameTable);
                        xr.XmlResolver = resolver;
                        Load (xr);
                }
@@ -628,6 +651,10 @@ namespace System.Xml
                                        if (preserveWhitespace || n.NodeType != XmlNodeType.Whitespace)
                                                AppendChild (n);
                                } while (true);
+#if NET_2_0
+                               if (xmlReader.Settings != null)
+                                       schemas = xmlReader.Settings.Schemas;
+#endif
                        } finally {
                                loadMode = false;
                        }
@@ -636,7 +663,9 @@ namespace System.Xml
                public virtual void LoadXml (string xml)
                {
                        XmlTextReader xmlReader = new XmlTextReader (
-                               xml, XmlNodeType.Document, null);
+                               xml,
+                               XmlNodeType.Document,
+                               new XmlParserContext (NameTable, null, null, XmlSpace.None));
                        try {
                                xmlReader.XmlResolver = resolver;
                                Load (xmlReader);
@@ -645,22 +674,22 @@ namespace System.Xml
                        }
                }
 
-               internal void onNodeChanged (XmlNode node, XmlNode Parent)
+               internal void onNodeChanged (XmlNode node, XmlNode parent, string oldValue, string newValue)
                {
                        if (NodeChanged != null)
                                NodeChanged (node, new XmlNodeChangedEventArgs
                                        (XmlNodeChangedAction.Change,
-                                       node, Parent, Parent));
+                                       node, parent, oldValue, newValue));
                }
 
-               internal void onNodeChanging(XmlNode node, XmlNode Parent)
+               internal void onNodeChanging(XmlNode node, XmlNode parent, string oldValue, string newValue)
                {
                        if (node.IsReadOnly)
                                throw new ArgumentException ("Node is read-only.");
                        if (NodeChanging != null)
                                NodeChanging (node, new XmlNodeChangedEventArgs
                                        (XmlNodeChangedAction.Change,
-                                       node, Parent, Parent));
+                                       node, parent, oldValue, newValue));
                }
 
                internal void onNodeInserted (XmlNode node, XmlNode newParent)
@@ -709,21 +738,24 @@ namespace System.Xml
                }
 
                // Reads XmlReader and creates Attribute Node.
-               private XmlAttribute ReadAttributeNode(XmlReader reader)
+               private XmlAttribute ReadAttributeNode (XmlReader reader)
                {
-                       if(reader.NodeType == XmlNodeType.Element)
+                       if (reader.NodeType == XmlNodeType.Element)
                                reader.MoveToFirstAttribute ();
-                       else if(reader.NodeType != XmlNodeType.Attribute)
+                       else if (reader.NodeType != XmlNodeType.Attribute)
                                throw new InvalidOperationException (MakeReaderErrorMessage ("bad position to read attribute.", reader));
                        XmlAttribute attribute = CreateAttribute (reader.Prefix, reader.LocalName, reader.NamespaceURI, false, false); // different NameTable
+#if NET_2_0
+                       if (reader.SchemaInfo != null)
+                               SchemaInfo = new XmlSchemaInfo (reader.SchemaInfo);
+#endif
                        ReadAttributeNodeValue (reader, attribute);
 
-                       // Keep the current reader position
-                       bool res;
-                       if (attribute.NamespaceURI == string.Empty || attribute.NamespaceURI == null)
-                               res = reader.MoveToAttribute (attribute.Name);
+                       // Keep the current reader position on attribute.
+                       if (attribute.NamespaceURI == null)
+                               reader.MoveToAttribute (attribute.Name);
                        else 
-                               res = reader.MoveToAttribute (attribute.LocalName, attribute.NamespaceURI);
+                               reader.MoveToAttribute (attribute.LocalName, attribute.NamespaceURI);
                        if (reader.IsDefault)
                                attribute.SetDefault ();
                        return attribute;
@@ -769,6 +801,10 @@ namespace System.Xml
 
                        case XmlNodeType.Element:
                                XmlElement element = CreateElement (reader.Prefix, reader.LocalName, reader.NamespaceURI);
+#if NET_2_0
+                               if (reader.SchemaInfo != null)
+                                       SchemaInfo = new XmlSchemaInfo (reader.SchemaInfo);
+#endif
                                element.IsEmpty = reader.IsEmptyElement;
 
                                // set the element's attributes.
@@ -810,15 +846,6 @@ namespace System.Xml
 
                        case XmlNodeType.DocumentType:
                                DTDObjectModel dtd = null;
-                               XmlTextReader xtReader = reader as XmlTextReader;
-                               if (xtReader != null)
-                                       dtd = xtReader.DTD;
-                               XmlNodeReader xnReader = reader as XmlNodeReader;
-                               if (xnReader != null)
-                                       dtd = xnReader.GetInternalParserContext ().Dtd;
-                               XmlValidatingReader xvReader = reader as XmlValidatingReader;
-                               if (xvReader != null)
-                                       dtd = xvReader.GetInternalParserContext ().Dtd;
                                IHasXmlParserContext ctxReader = reader as IHasXmlParserContext;
                                if (ctxReader != null)
                                        dtd = ctxReader.ParserContext.Dtd;
@@ -947,6 +974,39 @@ namespace System.Xml
                        nameTable.Add ("#document");
                        nameTable.Add ("#significant-whitespace");
                }
+
+#if NET_2_0
+               public void Validate (ValidationEventHandler handler)
+               {
+                       Validate (handler, this,
+                               XmlSchemaValidationFlags.IgnoreValidationWarnings);
+               }
+
+               public void Validate (ValidationEventHandler handler,
+                       XmlNode node)
+               {
+                       Validate (handler, node,
+                               XmlSchemaValidationFlags.IgnoreValidationWarnings |
+                               XmlSchemaValidationFlags.IgnoreIdentityConstraints);
+               }
+
+               private void Validate (ValidationEventHandler handler,
+                       XmlNode node, XmlSchemaValidationFlags flags)
+               {
+                       XmlReaderSettings settings = new XmlReaderSettings ();
+                       settings.NameTable = NameTable;
+                       settings.Schemas = schemas;
+                       settings.Schemas.XmlResolver = resolver;
+                       settings.XmlResolver = resolver;
+                       settings.ValidationFlags = flags;
+                       settings.ValidationType = ValidationType.Schema;
+                       XmlReader r = XmlReader.Create (
+                               new XmlNodeReader (node), settings);
+                       while (!r.EOF)
+                               r.Read ();
+               }
+#endif
+
                #endregion
        }
 }