Copied remotely
[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
11 //
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
19 // 
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 // 
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 //
31 using System;\r
32 using System.IO;\r
33 using System.Text;\r
34 using System.Xml.XPath;\r
35 \r
36 namespace System.Xml\r
37 {\r
38         public class XmlDocumentFragment : XmlNode\r
39         {\r
40 \r
41                 #region Constructor\r
42 \r
43                 protected internal XmlDocumentFragment (XmlDocument doc)\r
44                         : base (doc)\r
45                 {\r
46                 }\r
47                 \r
48                 #endregion\r
49 \r
50                 #region Properties\r
51 \r
52                 public override string InnerXml {\r
53                         set {\r
54                                 // Copied from XmlElement.InnerXml (in the meantime;-))\r
55                                 for (int i = 0; i < ChildNodes.Count; i++)\r
56                                         this.RemoveChild (ChildNodes [i]);\r
57 \r
58                                 // I hope there are any well-performance logic...\r
59                                 XmlNamespaceManager nsmgr = this.ConstructNamespaceManager ();\r
60                                 XmlParserContext ctx = new XmlParserContext (OwnerDocument.NameTable, nsmgr,
61                                         OwnerDocument.DocumentType != null ? OwnerDocument.DocumentType.DTD : null,
62                                         BaseURI, XmlLang, XmlSpace, null);
63                                 XmlTextReader xmlReader = new XmlTextReader (value, XmlNodeType.Element, ctx);\r
64                                 xmlReader.XmlResolver = OwnerDocument.Resolver;\r
65 \r
66                                 do {\r
67                                         XmlNode n = OwnerDocument.ReadNode (xmlReader);\r
68                                         if(n == null) break;\r
69                                         AppendChild (n);\r
70                                 } while (true);\r
71                         }\r
72                         get {\r
73                                 StringBuilder sb = new StringBuilder ();\r
74                                 for (int i = 0; i < ChildNodes.Count; i++)
75                                         sb.Append (ChildNodes [i].OuterXml);\r
76                                 return sb.ToString ();\r
77                         }\r
78                 }\r
79                 \r
80                 public override string LocalName {\r
81                         get { return "#document-fragment"; }\r
82                 }\r
83 \r
84 \r
85                 public override string Name { \r
86                         get { return "#document-fragment"; }\r
87                 }\r
88 \r
89                 public override XmlNodeType NodeType {\r
90                         get { return XmlNodeType.DocumentFragment; }\r
91                 }\r
92 \r
93                 public override XmlDocument OwnerDocument {\r
94                         get { return base.OwnerDocument; }\r
95                 }\r
96 \r
97                 public override XmlNode ParentNode {\r
98                         get { return null; } // it's always null here.\r
99                 }\r
100 \r
101                 internal override XPathNodeType XPathNodeType\r
102                 {\r
103                         get { return XPathNodeType.Root; }\r
104                 }\r
105                 #endregion\r
106 \r
107                 #region Methods         \r
108                 public override XmlNode CloneNode (bool deep)\r
109                 {\r
110                         if (deep) { // clone document + child nodes\r
111                                 XmlNode node = FirstChild;\r
112 \r
113                                 while ((node != null) && (node.HasChildNodes)) {\r
114                                         AppendChild (node.NextSibling.CloneNode (false));\r
115                                         node = node.NextSibling;\r
116                                 }\r
117 \r
118                                 return node;\r
119                         } else\r
120                                 return new XmlDocumentFragment (OwnerDocument);\r
121                 }\r
122 \r
123                 public override void WriteContentTo (XmlWriter w)\r
124                 {\r
125                         for (int i = 0; i < ChildNodes.Count; i++)
126                                 ChildNodes [i].WriteContentTo (w);\r
127                 }\r
128 \r
129                 public override void WriteTo (XmlWriter w)\r
130                 {\r
131                         for (int i = 0; i < ChildNodes.Count; i++)
132                                 ChildNodes [i].WriteTo (w);\r
133                 }\r
134 \r
135                 #endregion\r
136         }\r
137 }\r