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