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