2003-02-03 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System.XML / System.Xml / XmlDocumentFragment.cs
1 //\r
2 // System.Xml.XmlDocumentFragment\r
3 //\r
4 // Author:\r
5 //   Duncan Mak  (duncan@ximian.com)\r
6 //   Atsushi Enomoto  (ginga@kit.hi-ho.ne.jp)\r
7 //\r
8 // (C), Ximian, Inc\r
9 // (C)2002 Atsushi Enomoto\r
10 using System;\r
11 using System.IO;\r
12 using System.Text;\r
13 \r
14 namespace System.Xml\r
15 {\r
16         public class XmlDocumentFragment : XmlNode\r
17         {\r
18                 #region Fields\r
19 \r
20                 private XmlLinkedNode lastLinkedChild;\r
21 \r
22                 #endregion\r
23 \r
24                 #region Constructor\r
25 \r
26                 protected internal XmlDocumentFragment (XmlDocument doc)\r
27                         : base (doc)\r
28                 {\r
29                 }\r
30                 \r
31                 #endregion\r
32                 #region Properties\r
33 \r
34                 [MonoTODO("Setter is as incomplete as that of XmlElement.InnerXml")]\r
35                 public override string InnerXml {\r
36                         set {\r
37                                 // Copied from XmlElement.InnerXml (in the meantime;-))\r
38                                 foreach(XmlNode n in ChildNodes)\r
39                                 {\r
40                                         this.RemoveChild (n);\r
41                                 }                 \r
42 \r
43                                 // I hope there are any well-performance logic...\r
44                                 XmlNameTable nt = this.OwnerDocument.NameTable;\r
45                                 XmlNamespaceManager nsmgr = this.ConstructNamespaceManager ();\r
46                                 XmlParserContext ctx = new XmlParserContext (nt, nsmgr, XmlLang, this.XmlSpace);\r
47                                 XmlTextReader xmlReader = OwnerDocument.ReusableReader;\r
48                                 xmlReader.SetReaderContext (String.Empty, ctx);\r
49                                 xmlReader.SetReaderFragment (new StringReader (value), XmlNodeType.Element);\r
50 \r
51                                 do {\r
52                                         XmlNode n = OwnerDocument.ReadNode (xmlReader);\r
53                                         if(n == null) break;\r
54                                         AppendChild (n);\r
55                                 } while (true);\r
56                         }\r
57                         get {\r
58                                 StringBuilder sb = new StringBuilder ();\r
59                                 foreach(XmlNode n in ChildNodes)\r
60                                         sb.Append (n.OuterXml);\r
61                                 return sb.ToString ();\r
62                         }\r
63                 }\r
64                 \r
65                 public override string LocalName {\r
66                         get { return "#document-fragment"; }\r
67                 }\r
68 \r
69 \r
70                 public override string Name { \r
71                         get { return "#document-fragment"; }\r
72                 }\r
73 \r
74                 public override XmlNodeType NodeType {\r
75                         get { return XmlNodeType.DocumentFragment; }\r
76                 }\r
77 \r
78                 public override XmlDocument OwnerDocument {\r
79                         get { return base.OwnerDocument; }\r
80                 }\r
81 \r
82                 public override XmlNode ParentNode {\r
83                         get { return null; } // it's always null here.\r
84                 }\r
85 \r
86                 // It is really not a type of XmlLinkedNode,\r
87                 //   but I copied this way from XmlElement. I looks good.\r
88                 internal override XmlLinkedNode LastLinkedChild\r
89                 {\r
90                         get { return lastLinkedChild; }\r
91                         set { lastLinkedChild = value; }\r
92                 }\r
93                 #endregion\r
94 \r
95                 #region Methods         \r
96                 public override XmlNode CloneNode (bool deep)\r
97                 {\r
98                         if (deep) { // clone document + child nodes\r
99                                 XmlNode node = FirstChild;\r
100 \r
101                                 while ((node != null) && (node.HasChildNodes)) {\r
102                                         AppendChild (node.NextSibling.CloneNode (false));\r
103                                         node = node.NextSibling;\r
104                                 }\r
105 \r
106                                 return node;\r
107                         } else\r
108                                 return new XmlDocumentFragment (OwnerDocument);\r
109                 }\r
110 \r
111                 public override void WriteContentTo (XmlWriter w)\r
112                 {\r
113                         foreach(XmlNode n in ChildNodes)\r
114                                 n.WriteContentTo (w);\r
115                 }\r
116 \r
117                 public override void WriteTo (XmlWriter w)\r
118                 {\r
119                         foreach(XmlNode n in ChildNodes)\r
120                                 n.WriteTo (w);\r
121                 }\r
122 \r
123                 #endregion\r
124         }\r
125 }\r