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