2003-03-23 Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
[mono.git] / mcs / class / System.XML / System.Xml / XmlDocumentFragment.cs
index 1dbd74139eb7db86f03cbbb16debab358107dc10..130c7ab2e54794a5c42cd0dba54172a9b427179b 100644 (file)
+//\r
+// System.Xml.XmlDocumentFragment\r
+//\r
+// Author:\r
+//   Duncan Mak  (duncan@ximian.com)\r
+//   Atsushi Enomoto  (ginga@kit.hi-ho.ne.jp)\r
+//\r
+// (C), Ximian, Inc\r
+// (C)2002 Atsushi Enomoto\r
 using System;\r
+using System.IO;\r
+using System.Text;\r
 \r
 namespace System.Xml\r
 {\r
-       /// <summary>\r
-       /// \r
-       /// </summary>\r
-       public class XmlDocumentFragment\r
+       public class XmlDocumentFragment : XmlNode\r
        {\r
-               // Private data members\r
+               #region Fields\r
 \r
-               // public properties\r
+               private XmlLinkedNode lastLinkedChild;\r
+\r
+               #endregion\r
+\r
+               #region Constructor\r
+\r
+               protected internal XmlDocumentFragment (XmlDocument doc)\r
+                       : base (doc)\r
+               {\r
+               }\r
                \r
+               #endregion\r
+               #region Properties\r
+\r
+               [MonoTODO("Setter is as incomplete as that of XmlElement.InnerXml")]\r
+               public override string InnerXml {\r
+                       set {\r
+                               // Copied from XmlElement.InnerXml (in the meantime;-))\r
+                               foreach(XmlNode n in ChildNodes)\r
+                               {\r
+                                       this.RemoveChild (n);\r
+                               }                 \r
+\r
+                               // I hope there are any well-performance logic...\r
+                               XmlNameTable nt = this.OwnerDocument.NameTable;\r
+                               XmlNamespaceManager nsmgr = this.ConstructNamespaceManager ();\r
+                               XmlParserContext ctx = new XmlParserContext (nt, nsmgr, XmlLang, this.XmlSpace);\r
+                               XmlTextReader xmlReader = OwnerDocument.ReusableReader;\r
+                               xmlReader.Initialize (String.Empty, ctx, new StringReader (value), XmlNodeType.Element);\r
+\r
+                               do {\r
+                                       XmlNode n = OwnerDocument.ReadNode (xmlReader);\r
+                                       if(n == null) break;\r
+                                       AppendChild (n);\r
+                               } while (true);\r
+                       }\r
+                       get {\r
+                               StringBuilder sb = new StringBuilder ();\r
+                               foreach(XmlNode n in ChildNodes)\r
+                                       sb.Append (n.OuterXml);\r
+                               return sb.ToString ();\r
+                       }\r
+               }\r
+               \r
+               public override string LocalName {\r
+                       get { return "#document-fragment"; }\r
+               }\r
+\r
+\r
+               public override string Name { \r
+                       get { return "#document-fragment"; }\r
+               }\r
+\r
+               public override XmlNodeType NodeType {\r
+                       get { return XmlNodeType.DocumentFragment; }\r
+               }\r
+\r
+               public override XmlDocument OwnerDocument {\r
+                       get { return base.OwnerDocument; }\r
+               }\r
+\r
+               public override XmlNode ParentNode {\r
+                       get { return null; } // it's always null here.\r
+               }\r
+\r
+               // It is really not a type of XmlLinkedNode,\r
+               //   but I copied this way from XmlElement. I looks good.\r
+               internal override XmlLinkedNode LastLinkedChild\r
+               {\r
+                       get { return lastLinkedChild; }\r
+                       set { lastLinkedChild = value; }\r
+               }\r
+               #endregion\r
+\r
+               #region Methods         \r
+               public override XmlNode CloneNode (bool deep)\r
+               {\r
+                       if (deep) { // clone document + child nodes\r
+                               XmlNode node = FirstChild;\r
+\r
+                               while ((node != null) && (node.HasChildNodes)) {\r
+                                       AppendChild (node.NextSibling.CloneNode (false));\r
+                                       node = node.NextSibling;\r
+                               }\r
+\r
+                               return node;\r
+                       } else\r
+                               return new XmlDocumentFragment (OwnerDocument);\r
+               }\r
+\r
+               public override void WriteContentTo (XmlWriter w)\r
+               {\r
+                       foreach(XmlNode n in ChildNodes)\r
+                               n.WriteContentTo (w);\r
+               }\r
+\r
+               public override void WriteTo (XmlWriter w)\r
+               {\r
+                       foreach(XmlNode n in ChildNodes)\r
+                               n.WriteTo (w);\r
+               }\r
 \r
-               // Public Methods\r
+               #endregion\r
        }\r
 }\r