2 // XPathEditableNavigator.cs
5 // Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
7 // (C)2003 Atsushi Enomoto
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 using System
.Collections
;
35 using System
.Collections
.Specialized
;
36 using System
.ComponentModel
;
38 using System
.Security
.Policy
;
39 using System
.Xml
.Schema
;
40 using System
.Xml
.XPath
;
42 //using MS.Internal.Xml;
44 namespace System
.Xml
.XPath
46 public abstract class XPathEditableNavigator
47 : XPathNavigator
//, IXPathEditable
49 protected XPathEditableNavigator ()
53 public abstract XmlWriter
AppendChild ();
56 public virtual XPathEditableNavigator
AppendChild (
59 // FIXME: should XmlParserContext be something?
60 return AppendChild (new XmlTextReader (xmlFragments
, XmlNodeType
.Element
, null));
64 public virtual XPathEditableNavigator
AppendChild (
67 XmlWriter w
= AppendChild ();
69 w
.WriteNode (reader
, false);
71 XPathEditableNavigator nav
= (XPathEditableNavigator
) Clone ();
72 nav
.MoveToFirstChild ();
73 while (nav
.MoveToNext ())
79 public virtual XPathEditableNavigator
AppendChild (
82 return AppendChild (new XPathNavigatorReader (nav
));
85 public void AppendChildElement (string prefix
, string name
, string ns
, string value)
87 XmlWriter xw
= AppendChild ();
88 xw
.WriteStartElement (prefix
, name
, ns
);
89 xw
.WriteString (value);
90 xw
.WriteEndElement ();
95 protected void BuildSubTree (XmlReader reader
, XmlWriter writer
, bool useValidity
)
97 throw new NotImplementedException ();
100 public virtual void CreateAttribute (string prefix
, string localName
, string namespaceURI
, string value)
102 using (XmlWriter w
= CreateAttributes ()) {
103 w
.WriteAttributeString (prefix
, localName
, namespaceURI
, value);
107 public abstract XmlWriter
CreateAttributes ();
110 public virtual XPathEditableNavigator CreateEditor ()
112 return (XPathEditableNavigator) Clone ();
115 // LAMESPEC: documented as public abstract, but it conflicts
116 // with XPathNavigator.CreateNavigator ().
118 public override XPathNavigator CreateNavigator ()
123 public abstract bool DeleteCurrent ();
125 public virtual XmlWriter
InsertAfter ()
127 XPathEditableNavigator nav
= (XPathEditableNavigator
) Clone ();
128 if (nav
.MoveToNext ())
129 return nav
.InsertBefore ();
131 return AppendChild ();
134 public virtual XPathEditableNavigator
InsertAfter (string xmlFragments
)
136 return InsertAfter (new XmlTextReader (xmlFragments
, XmlNodeType
.Element
, null));
140 public virtual XPathEditableNavigator
InsertAfter (XmlReader reader
)
142 using (XmlWriter w
= InsertAfter ()) {
143 w
.WriteNode (reader
, false);
145 XPathEditableNavigator nav
= (XPathEditableNavigator
) Clone ();
151 public virtual XPathEditableNavigator
InsertAfter (XPathNavigator nav
)
153 return InsertAfter (new XPathNavigatorReader (nav
));
156 public abstract XmlWriter
InsertBefore ();
158 public virtual XPathEditableNavigator
InsertBefore (string xmlFragments
)
160 return InsertBefore (new XmlTextReader (xmlFragments
, XmlNodeType
.Element
, null));
164 public virtual XPathEditableNavigator
InsertBefore (XmlReader reader
)
166 using (XmlWriter w
= InsertBefore ()) {
167 w
.WriteNode (reader
, false);
169 XPathEditableNavigator nav
= (XPathEditableNavigator
) Clone ();
170 nav
.MoveToPrevious ();
175 public virtual XPathEditableNavigator
InsertBefore (XPathNavigator nav
)
177 return InsertBefore (new XPathNavigatorReader (nav
));
180 public virtual void InsertElementAfter (string prefix
,
181 string localName
, string namespaceURI
, string value)
183 using (XmlWriter w
= InsertAfter ()) {
184 w
.WriteElementString (prefix
, localName
, namespaceURI
, value);
188 public virtual void InsertElementBefore (string prefix
,
189 string localName
, string namespaceURI
, string value)
191 using (XmlWriter w
= InsertBefore ()) {
192 w
.WriteElementString (prefix
, localName
, namespaceURI
, value);
196 public virtual XmlWriter
PrependChild ()
198 XPathEditableNavigator nav
= (XPathEditableNavigator
) Clone ();
199 if (nav
.MoveToFirstChild ())
200 return nav
.InsertBefore ();
202 return InsertBefore ();
205 public virtual XPathEditableNavigator
PrependChild (string xmlFragments
)
207 return PrependChild (new XmlTextReader (xmlFragments
, XmlNodeType
.Element
, null));
211 public virtual XPathEditableNavigator
PrependChild (XmlReader reader
)
213 using (XmlWriter w
= PrependChild ()) {
214 w
.WriteNode (reader
, false);
216 XPathEditableNavigator nav
= (XPathEditableNavigator
) Clone ();
217 nav
.MoveToFirstChild ();
222 public virtual XPathEditableNavigator
PrependChild (XPathNavigator nav
)
224 return PrependChild (new XPathNavigatorReader (nav
));
227 public virtual void PrependChildElement (string prefix
,
228 string localName
, string namespaceURI
, string value)
230 using (XmlWriter w
= PrependChild ()) {
231 w
.WriteElementString (prefix
, localName
, namespaceURI
, value);
235 // Dunno the exact purpose, but maybe internal editor use
237 public virtual void SetFromObject (object value)
239 throw new NotImplementedException ();
242 public abstract void SetValue (object value);
245 public virtual void Validate (XmlSchemaSet schemas
, ValidationEventHandler handler
)
247 throw new NotImplementedException ();
251 // It seems like setter is virtual but getter is overriden.
252 public virtual new string InnerXml
{
255 if (NodeType
== XPathNodeType
.Attribute
) {
259 AppendChild (new XmlTextReader (value, XmlNodeType
.Element
, null));
263 private void DeleteChildren ()
266 case XPathNodeType
.Namespace
:
267 throw new InvalidOperationException ("Removing namespace node content is not supported.");
268 case XPathNodeType
.Attribute
:
270 case XPathNodeType
.Text
:
271 case XPathNodeType
.SignificantWhitespace
:
272 case XPathNodeType
.Whitespace
:
273 case XPathNodeType
.ProcessingInstruction
:
274 case XPathNodeType
.Comment
:
280 XPathEditableNavigator nav
= (XPathEditableNavigator
) Clone ();
281 nav
.MoveToFirstChild ();
282 while (!nav
.IsSamePosition (this))
283 nav
.DeleteCurrent ();
287 // It seems like setter is virtual but getter is overriden.
288 public virtual new string OuterXml
{
290 return base.OuterXml
;
294 case XPathNodeType
.Root
:
295 case XPathNodeType
.Attribute
:
296 case XPathNodeType
.Namespace
:
297 throw new XmlException ("Setting OuterXml Root, Attribute and Namespace is not supported.");
300 // XPathEditableNavigator nav = (XPathEditableNavigator) Clone ();
301 // nav.MoveToParent ();