5 // Kral Ferch <kral_ferch@hotmail.com>
11 using System.Collections;
14 using System.Xml.XPath;
18 public abstract class XmlNode : ICloneable, IEnumerable, IXPathNavigable
22 XmlDocument ownerDocument;
29 internal XmlNode (XmlDocument ownerDocument)
31 this.ownerDocument = ownerDocument;
38 public virtual XmlAttributeCollection Attributes
43 public virtual string BaseURI
45 get { return ParentNode.BaseURI; }
48 public virtual XmlNodeList ChildNodes {
50 return new XmlNodeListChildren(this);
54 public virtual XmlNode FirstChild {
56 if (LastChild != null) {
57 return LastLinkedChild.NextLinkedSibling;
65 public virtual bool HasChildNodes {
66 get { return LastChild != null; }
70 public virtual string InnerText {
72 StringBuilder builder = new StringBuilder ();
73 AppendChildValues (this, builder);
74 return builder.ToString ();
77 set { throw new NotImplementedException (); }
80 private void AppendChildValues(XmlNode parent, StringBuilder builder)
82 XmlNode node = parent.FirstChild;
84 while (node != null) {
85 builder.Append (node.Value);
86 AppendChildValues (node, builder);
87 node = node.NextSibling;
92 public virtual string InnerXml {
94 StringWriter sw = new StringWriter ();
95 XmlTextWriter xtw = new XmlTextWriter (sw);
99 return sw.GetStringBuilder().ToString();
102 set { throw new NotImplementedException (); }
105 public virtual bool IsReadOnly {
106 get { return false; }
109 [System.Runtime.CompilerServices.IndexerName("Item")]
110 public virtual XmlElement this [string name] {
112 foreach (XmlNode node in ChildNodes) {
113 if ((node.NodeType == XmlNodeType.Element) &&
114 (node.Name == name)) {
115 return (XmlElement) node;
123 [System.Runtime.CompilerServices.IndexerName("Item")]
124 public virtual XmlElement this [string localname, string ns] {
126 foreach (XmlNode node in ChildNodes) {
127 if ((node.NodeType == XmlNodeType.Element) &&
128 (node.LocalName == localname) &&
129 (node.NamespaceURI == ns)) {
130 return (XmlElement) node;
138 public virtual XmlNode LastChild {
139 get { return LastLinkedChild; }
142 internal virtual XmlLinkedNode LastLinkedChild {
147 public abstract string LocalName { get; }
149 public abstract string Name { get; }
151 public virtual string NamespaceURI {
152 get { return String.Empty; }
155 public virtual XmlNode NextSibling {
159 public abstract XmlNodeType NodeType { get; }
161 public virtual string OuterXml {
163 StringWriter sw = new StringWriter ();
164 XmlTextWriter xtw = new XmlTextWriter (sw);
168 return sw.GetStringBuilder().ToString();
172 public virtual XmlDocument OwnerDocument {
173 get { return ownerDocument; }
176 public virtual XmlNode ParentNode {
177 get { return parentNode; }
180 public virtual string Prefix {
181 get { return String.Empty; }
185 public virtual XmlNode PreviousSibling {
189 public virtual string Value {
191 set { throw new InvalidOperationException ("This node does not have a value"); }
198 public virtual XmlNode AppendChild (XmlNode newChild)
200 if (NodeType == XmlNodeType.Document
201 || NodeType == XmlNodeType.Element
202 || NodeType == XmlNodeType.Attribute) {
203 XmlLinkedNode newLinkedChild = (XmlLinkedNode) newChild;
204 XmlLinkedNode lastLinkedChild = LastLinkedChild;
206 newLinkedChild.parentNode = this;
208 if (lastLinkedChild != null) {
209 newLinkedChild.NextLinkedSibling = lastLinkedChild.NextLinkedSibling;
210 lastLinkedChild.NextLinkedSibling = newLinkedChild;
212 newLinkedChild.NextLinkedSibling = newLinkedChild;
214 LastLinkedChild = newLinkedChild;
218 throw new InvalidOperationException();
222 public virtual XmlNode Clone ()
224 throw new NotImplementedException ();
227 public abstract XmlNode CloneNode (bool deep);
230 public virtual XPathNavigator CreateNavigator ()
232 return new XmlDocumentNavigator(this);
235 public IEnumerator GetEnumerator ()
237 return new XmlNodeListChildren(this).GetEnumerator();
241 public virtual string GetNamespaceOfPrefix (string prefix)
243 throw new NotImplementedException ();
247 public virtual string GetPrefixOfNamespace (string namespaceURI)
249 throw new NotImplementedException ();
252 object ICloneable.Clone ()
257 IEnumerator IEnumerable.GetEnumerator ()
259 return GetEnumerator ();
263 public virtual XmlNode InsertAfter (XmlNode newChild, XmlNode refChild)
265 throw new NotImplementedException ();
269 public virtual XmlNode InsertBefore (XmlNode newChild, XmlNode refChild)
271 throw new NotImplementedException ();
275 public virtual void Normalize ()
277 throw new NotImplementedException ();
281 public virtual XmlNode PrependChild (XmlNode newChild)
283 throw new NotImplementedException ();
286 public virtual void RemoveAll ()
288 LastLinkedChild = null;
291 public virtual XmlNode RemoveChild (XmlNode oldChild)
293 if (NodeType == XmlNodeType.Document || NodeType == XmlNodeType.Element || NodeType == XmlNodeType.Attribute)
296 throw new ArgumentException();
298 if (Object.ReferenceEquals(LastLinkedChild, LastLinkedChild.NextLinkedSibling) && Object.ReferenceEquals(LastLinkedChild, oldChild))
299 LastLinkedChild = null;
301 XmlLinkedNode oldLinkedChild = (XmlLinkedNode)oldChild;
302 XmlLinkedNode beforeLinkedChild = LastLinkedChild;
304 while (!Object.ReferenceEquals(beforeLinkedChild.NextLinkedSibling, LastLinkedChild) && !Object.ReferenceEquals(beforeLinkedChild.NextLinkedSibling, oldLinkedChild))
305 beforeLinkedChild = beforeLinkedChild.NextLinkedSibling;
307 if (!Object.ReferenceEquals(beforeLinkedChild.NextLinkedSibling, oldLinkedChild))
308 throw new ArgumentException();
310 beforeLinkedChild.NextLinkedSibling = oldLinkedChild.NextLinkedSibling;
311 oldLinkedChild.NextLinkedSibling = null;
317 throw new ArgumentException();
321 public virtual XmlNode ReplaceChild (XmlNode newChild, XmlNode oldChild)
323 throw new NotImplementedException ();
326 public XmlNodeList SelectNodes (string xpath)
328 return SelectNodes (xpath, null);
332 public XmlNodeList SelectNodes (string xpath, XmlNamespaceManager nsmgr)
334 XPathNavigator nav = CreateNavigator ();
335 XPathExpression expr = nav.Compile (xpath);
337 expr.SetContext (nsmgr);
338 XPathNodeIterator iter = nav.Select (expr);
339 ArrayList rgNodes = new ArrayList ();
340 while (iter.MoveNext ())
342 rgNodes.Add (((XmlDocumentNavigator) iter.Current).Node);
344 return new XmlNodeArrayList (rgNodes);
347 public XmlNode SelectSingleNode (string xpath)
349 return SelectSingleNode (xpath, null);
353 public XmlNode SelectSingleNode (string xpath, XmlNamespaceManager nsmgr)
355 XPathNavigator nav = CreateNavigator ();
356 XPathExpression expr = nav.Compile (xpath);
358 expr.SetContext (nsmgr);
359 XPathNodeIterator iter = nav.Select (expr);
360 if (!iter.MoveNext ())
362 return ((XmlDocumentNavigator) iter.Current).Node;
365 internal void SetParentNode (XmlNode parent)
371 public virtual bool Supports (string feature, string version)
373 throw new NotImplementedException ();
376 public abstract void WriteContentTo (XmlWriter w);
378 public abstract void WriteTo (XmlWriter w);