implementing XmlElement.SetAttributeNode(localName, namespaceURI) and
[mono.git] / mcs / class / System.XML / System.Xml / XmlElement.cs
1 //
2 // System.Xml.XmlAttribute
3 //
4 // Author:
5 //   Jason Diamond (jason@injektilo.org)
6 //
7 // (C) 2002 Jason Diamond  http://injektilo.org/
8 //
9
10 using System;
11 using System.Collections;
12
13 namespace System.Xml
14 {
15         public class XmlElement : XmlLinkedNode
16         {
17                 #region Fields
18
19                 private XmlAttributeCollection attributes;
20                 private XmlLinkedNode lastLinkedChild;
21                 private string localName;
22                 private string namespaceURI;
23                 private string prefix;
24
25                 #endregion
26
27                 #region Constructor
28
29                 protected internal XmlElement (
30                         string prefix, 
31                         string localName, 
32                         string namespaceURI, 
33                         XmlDocument doc) : base (doc)
34                 {
35                         this.prefix = prefix;
36                         this.localName = localName;
37                         this.namespaceURI = namespaceURI;
38
39                         attributes = new XmlAttributeCollection (this);
40                 }
41
42                 #endregion
43
44                 #region Properties
45
46                 public override XmlAttributeCollection Attributes {
47                         get { return attributes; }
48                 }
49
50                 public virtual bool HasAttributes {
51                         get { return attributes.Count > 0; }
52                 }
53
54                 [MonoTODO ("Setter.")]
55                 public override string InnerText {
56                         get {
57                                 // Not sure why this is an override.  Passing through for now.
58                                 return base.InnerText;
59                         }
60                         set { throw new NotImplementedException (); }
61                 }
62
63                 [MonoTODO ("Setter.")]
64                 public override string InnerXml {
65                         get {
66                                 // Not sure why this is an override.  Passing through for now.
67                                 return base.InnerXml;
68                         }
69                         set { throw new NotImplementedException (); }
70                 }
71
72                 [MonoTODO]
73                 public bool IsEmpty {
74                         get { throw new NotImplementedException (); }
75
76                         set { throw new NotImplementedException (); }
77                 }
78
79                 internal override XmlLinkedNode LastLinkedChild {
80                         get { return lastLinkedChild; }
81
82                         set { lastLinkedChild = value; }
83                 }
84                 
85                 public override string LocalName {
86                         get { return localName; }
87                 }
88
89                 public override string Name {
90                         get { 
91                                 return prefix != String.Empty ? prefix + ":" + localName : localName; 
92                         }
93                 }
94
95                 public override string NamespaceURI {
96                         get { return namespaceURI; }
97                 }
98
99                 [MonoTODO]
100                 public override XmlNode NextSibling {
101                         get { 
102                                 return base.NextSibling; 
103                         }
104                 }
105
106                 public override XmlNodeType NodeType {
107                         get { 
108                                 return XmlNodeType.Element; 
109                         }
110                 }
111
112                 [MonoTODO]
113                 public override XmlDocument OwnerDocument {
114                         get { 
115                                 return base.OwnerDocument; 
116                         }
117                 }
118
119                 public override string Prefix {
120                         get { return prefix; }
121                         set { prefix = value; }
122                 }
123
124                 #endregion
125
126                 #region Methods
127                 
128                 [MonoTODO]
129                 public override XmlNode CloneNode (bool deep)
130                 {
131                         XmlNode node =  new XmlElement (prefix, localName, namespaceURI,
132                                                         OwnerDocument);
133
134                         for (int i = 0; i < node.Attributes.Count; i++)
135                                 node.AppendChild (node.Attributes [i].CloneNode (false));
136                         
137                         if (deep) {
138                                 while ((node != null) && (node.HasChildNodes)) {                                        
139                                         AppendChild (node.NextSibling.CloneNode (true));
140                                         node = node.NextSibling;
141                                 }
142                         } // shallow cloning
143                                 
144                         //
145                         // Reminder: Also look into Default attributes.
146                         //
147                         return node;
148                 }
149
150                 [MonoTODO]
151                 public virtual string GetAttribute (string name)
152                 {
153                         XmlNode attributeNode = Attributes.GetNamedItem (name);
154                         return attributeNode != null ? attributeNode.Value : String.Empty;
155                 }
156
157                 [MonoTODO]
158                 public virtual string GetAttribute (string localName, string namespaceURI)
159                 {
160                         XmlNode attributeNode = Attributes.GetNamedItem (localName, namespaceURI);
161                         return attributeNode != null ? attributeNode.Value : String.Empty;
162                 }
163
164                 [MonoTODO]
165                 public virtual XmlAttribute GetAttributeNode (string name)
166                 {
167                         XmlNode attributeNode = Attributes.GetNamedItem (name);
168                         return attributeNode != null ? attributeNode as XmlAttribute : null;
169                 }
170
171                 [MonoTODO]
172                 public virtual XmlAttribute GetAttributeNode (string localName, string namespaceURI)
173                 {
174                         XmlNode attributeNode = Attributes.GetNamedItem (localName, namespaceURI);
175                         return attributeNode != null ? attributeNode as XmlAttribute : null;
176                 }
177
178                 public virtual XmlNodeList GetElementsByTagName (string name)
179                 {
180                         ArrayList nodeArrayList = new ArrayList ();
181                         this.searchNodesRecursively (this, name, String.Empty, nodeArrayList);
182                         return new XmlNodeArrayList (nodeArrayList);
183                 }
184
185                 private void searchNodesRecursively (XmlNode argNode, string argName, string argNamespaceURI, 
186                         ArrayList argArrayList)
187                 {
188                         XmlNodeList xmlNodeList = argNode.ChildNodes;
189                         foreach (XmlNode node in xmlNodeList)
190                         {
191                                 if (node.LocalName.Equals (argName) && node.NamespaceURI.Equals (argNamespaceURI))
192                                         argArrayList.Add (node);
193                                 else    
194                                         this.searchNodesRecursively (node, argName, argNamespaceURI, argArrayList);
195                         }
196                 }
197
198                 public virtual XmlNodeList GetElementsByTagName (string localName, string namespaceURI)
199                 {
200                         ArrayList nodeArrayList = new ArrayList ();
201                         this.searchNodesRecursively (this, localName, namespaceURI, nodeArrayList);
202                         return new XmlNodeArrayList (nodeArrayList);
203                 }
204
205                 [MonoTODO]
206                 public virtual bool HasAttribute (string name)
207                 {
208                         XmlNode attributeNode = Attributes.GetNamedItem (name);
209                         return attributeNode != null;
210                 }
211
212                 [MonoTODO]
213                 public virtual bool HasAttribute (string localName, string namespaceURI)
214                 {
215                         throw new NotImplementedException ();
216                 }
217
218                 [MonoTODO ("Don't remove default attributes.")]
219                 public override void RemoveAll ()
220                 {
221                         // Remove the child nodes.
222                         base.RemoveAll ();
223
224                         // Remove all attributes.
225                         attributes.RemoveAll ();
226                 }
227
228                 public virtual void RemoveAllAttributes ()
229                 {
230                         attributes.RemoveAll ();
231                 }
232
233                 [MonoTODO]
234                 public virtual void RemoveAttribute (string name)
235                 {
236                         throw new NotImplementedException ();
237                 }
238
239                 [MonoTODO]
240                 public virtual void RemoveAttribute (string localName, string namespaceURI)
241                 {
242                         throw new NotImplementedException ();
243                 }
244
245                 [MonoTODO]
246                 public virtual XmlNode RemoveAttributeAt (int i)
247                 {
248                         throw new NotImplementedException ();
249                 }
250
251                 [MonoTODO]
252                 public virtual XmlAttribute RemoveAttributeNode (XmlAttribute oldAttr)
253                 {
254                         throw new NotImplementedException ();
255                 }
256
257                 [MonoTODO]
258                 public virtual XmlAttribute RemoveAttributeNode (string localName, string namespaceURI)
259                 {
260                         throw new NotImplementedException ();
261                 }
262
263                 [MonoTODO]
264                 public virtual void SetAttribute (string name, string value)
265                 {
266                         XmlAttribute attribute = OwnerDocument.CreateAttribute (name);
267                         attribute.SetParentNode (this);
268                         attribute.Value = value;
269                         Attributes.SetNamedItem (attribute);
270                 }
271
272                 [MonoTODO]
273                 public virtual string SetAttribute (string localName, string namespaceURI, string value)
274                 {
275                         throw new NotImplementedException ();
276                 }
277
278                 [MonoTODO]
279                 public virtual XmlAttribute SetAttributeNode (XmlAttribute newAttr)
280                 {
281                         newAttr.SetParentNode(this);
282                         XmlNode oldAttr = Attributes.SetNamedItem(newAttr);
283                         return oldAttr != null ? oldAttr as XmlAttribute : null;
284                 }
285
286                 
287                 public virtual XmlAttribute SetAttributeNode (string localName, string namespaceURI)
288                 {
289                         XmlDocument xmlDoc = this.OwnerDocument;\r
290                         XmlAttribute xmlAttribute = new XmlAttribute (String.Empty, localName, namespaceURI, xmlDoc);   \r
291                         return this.attributes.Append (xmlAttribute);
292                 }
293
294                 public override void WriteContentTo (XmlWriter w)
295                 {
296                         foreach(XmlNode childNode in ChildNodes)
297                                 childNode.WriteTo(w);
298                 }
299
300                 public override void WriteTo (XmlWriter w)
301                 {
302                         w.WriteStartElement(Prefix, LocalName, NamespaceURI);
303
304                         foreach(XmlNode attributeNode in Attributes)
305                                 attributeNode.WriteTo(w);
306
307                         WriteContentTo(w);
308
309                         w.WriteEndElement();
310                 }
311
312                 #endregion
313         }
314 }