c79010411e065730f6d961aba10111b2e4d6d8d5
[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 using System.Xml.XPath;
13
14 namespace System.Xml
15 {
16         public class XmlElement : XmlLinkedNode
17         {
18                 #region Fields
19
20                 private XmlAttributeCollection attributes;
21                 private XmlLinkedNode lastLinkedChild;
22                 private string localName;
23                 private string namespaceURI;
24                 private string prefix;
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 InnerText {
57                         get {
58                                 // Not sure why this is an override.  Passing through for now.
59                                 return base.InnerText;
60                         }
61                         set { throw new NotImplementedException (); }
62                 }
63
64                 [MonoTODO ("Setter is immature")]
65                 public override string InnerXml {
66                         get {
67                                 // Not sure why this is an override.  Passing through for now.
68                                 return base.InnerXml;
69                         }
70                         set {
71                                 foreach(XmlNode n in ChildNodes)
72                                 {
73                                         this.RemoveChild(n);
74                                 }                 
75
76                                 // How to get xml:lang and xml:space? Create logic as ConstructNamespaceManager()?
77                                 XmlNameTable nt = this.OwnerDocument.NameTable;
78                                 XmlNamespaceManager nsmgr = this.ConstructNamespaceManager(); //new XmlNamespaceManager(nt);
79                                 string lang = "";
80                                 XmlSpace space = XmlSpace.Default;
81
82                                 XmlParserContext ctx = new XmlParserContext(nt, nsmgr, lang, space);
83                                 XmlTextReader xmlReader = new XmlTextReader(value, this.NodeType, ctx);
84                                 this.ConstructDOM(xmlReader, this);
85                         }
86                 }
87
88                 [MonoTODO]
89                 public bool IsEmpty {
90                         get { throw new NotImplementedException (); }
91
92                         set { throw new NotImplementedException (); }
93                 }
94
95                 internal override XmlLinkedNode LastLinkedChild {
96                         get { return lastLinkedChild; }
97
98                         set { lastLinkedChild = value; }
99                 }
100                 
101                 public override string LocalName {
102                         get { return localName; }
103                 }
104
105                 public override string Name {
106                         get { 
107                                 return prefix != String.Empty ? prefix + ":" + localName : localName; 
108                         }
109                 }
110
111                 public override string NamespaceURI {
112                         get { return namespaceURI; }
113                 }
114
115                 [MonoTODO]
116                 public override XmlNode NextSibling {
117                         get { 
118                                 return base.NextSibling; 
119                         }
120                 }
121
122                 public override XmlNodeType NodeType {
123                         get { 
124                                 return XmlNodeType.Element; 
125                         }
126                 }
127
128                 internal override XPathNodeType XPathNodeType {
129                         get {
130                                 return XPathNodeType.Element;
131                         }
132                 }
133
134                 [MonoTODO]
135                 public override XmlDocument OwnerDocument {
136                         get { 
137                                 return base.OwnerDocument; 
138                         }
139                 }
140
141                 public override string Prefix {
142                         get { return prefix; }
143                         set { prefix = value; }
144                 }
145
146                 #endregion
147
148                 #region Methods
149                 
150                 [MonoTODO]
151                 public override XmlNode CloneNode (bool deep)
152                 {
153                         XmlNode node =  new XmlElement (prefix, localName, namespaceURI,
154                                                         OwnerDocument);
155
156                         for (int i = 0; i < node.Attributes.Count; i++)
157                                 node.AppendChild (node.Attributes [i].CloneNode (false));
158                         
159                         if (deep) {
160                                 while ((node != null) && (node.HasChildNodes)) {                                        
161                                         AppendChild (node.NextSibling.CloneNode (true));
162                                         node = node.NextSibling;
163                                 }
164                         } // shallow cloning
165                                 
166                         //
167                         // Reminder: Also look into Default attributes.
168                         //
169                         return node;
170                 }
171
172                 [MonoTODO]
173                 public virtual string GetAttribute (string name)
174                 {
175                         XmlNode attributeNode = Attributes.GetNamedItem (name);
176                         return attributeNode != null ? attributeNode.Value : String.Empty;
177                 }
178
179                 [MonoTODO]
180                 public virtual string GetAttribute (string localName, string namespaceURI)
181                 {
182                         XmlNode attributeNode = Attributes.GetNamedItem (localName, namespaceURI);
183                         return attributeNode != null ? attributeNode.Value : String.Empty;
184                 }
185
186                 [MonoTODO]
187                 public virtual XmlAttribute GetAttributeNode (string name)
188                 {
189                         XmlNode attributeNode = Attributes.GetNamedItem (name);
190                         return attributeNode != null ? attributeNode as XmlAttribute : null;
191                 }
192
193                 [MonoTODO]
194                 public virtual XmlAttribute GetAttributeNode (string localName, string namespaceURI)
195                 {
196                         XmlNode attributeNode = Attributes.GetNamedItem (localName, namespaceURI);
197                         return attributeNode != null ? attributeNode as XmlAttribute : null;
198                 }
199
200                 public virtual XmlNodeList GetElementsByTagName (string name)
201                 {
202                         ArrayList nodeArrayList = new ArrayList ();
203                         this.searchNodesRecursively (this, name, nodeArrayList);
204                         return new XmlNodeArrayList (nodeArrayList);
205                 }
206
207                 private void searchNodesRecursively (XmlNode argNode, string argName, 
208                         ArrayList argArrayList)
209                 {
210                         XmlNodeList xmlNodeList = argNode.ChildNodes;
211                         foreach (XmlNode node in xmlNodeList){
212                                 if (node.Name.Equals (argName))
213                                         argArrayList.Add (node);
214                                 else    
215                                         this.searchNodesRecursively (node, argName, argArrayList);
216                         }
217                 }
218
219                 private void searchNodesRecursively (XmlNode argNode, string argName, string argNamespaceURI, 
220                         ArrayList argArrayList)
221                 {
222                         XmlNodeList xmlNodeList = argNode.ChildNodes;
223                         foreach (XmlNode node in xmlNodeList)
224                         {
225                                 if (node.LocalName.Equals (argName) && node.NamespaceURI.Equals (argNamespaceURI))
226                                         argArrayList.Add (node);
227                                 else    
228                                         this.searchNodesRecursively (node, argName, argNamespaceURI, argArrayList);
229                         }
230                 }
231
232                 public virtual XmlNodeList GetElementsByTagName (string localName, string namespaceURI)
233                 {
234                         ArrayList nodeArrayList = new ArrayList ();
235                         this.searchNodesRecursively (this, localName, namespaceURI, nodeArrayList);
236                         return new XmlNodeArrayList (nodeArrayList);
237                 }
238
239                 [MonoTODO]
240                 public virtual bool HasAttribute (string name)
241                 {
242                         XmlNode attributeNode = Attributes.GetNamedItem (name);
243                         return attributeNode != null;
244                 }
245
246                 [MonoTODO]
247                 public virtual bool HasAttribute (string localName, string namespaceURI)
248                 {
249                         throw new NotImplementedException ();
250                 }
251
252                 [MonoTODO ("Don't remove default attributes.")]
253                 public override void RemoveAll ()
254                 {
255                         // Remove the child nodes.
256                         base.RemoveAll ();
257
258                         // Remove all attributes.
259                         attributes.RemoveAll ();
260                 }
261
262                 public virtual void RemoveAllAttributes ()
263                 {
264                         attributes.RemoveAll ();
265                 }
266
267                 [MonoTODO]
268                 public virtual void RemoveAttribute (string name)
269                 {
270                         throw new NotImplementedException ();
271                 }
272
273                 [MonoTODO]
274                 public virtual void RemoveAttribute (string localName, string namespaceURI)
275                 {
276                         throw new NotImplementedException ();
277                 }
278
279                 [MonoTODO]
280                 public virtual XmlNode RemoveAttributeAt (int i)
281                 {
282                         throw new NotImplementedException ();
283                 }
284
285                 [MonoTODO]
286                 public virtual XmlAttribute RemoveAttributeNode (XmlAttribute oldAttr)
287                 {
288                         throw new NotImplementedException ();
289                 }
290
291                 [MonoTODO]
292                 public virtual XmlAttribute RemoveAttributeNode (string localName, string namespaceURI)
293                 {
294                         throw new NotImplementedException ();
295                 }
296
297                 [MonoTODO]
298                 public virtual void SetAttribute (string name, string value)
299                 {
300                         XmlAttribute attribute = OwnerDocument.CreateAttribute (name);
301                         attribute.SetParentNode (this);
302                         attribute.Value = value;
303                         Attributes.SetNamedItem (attribute);
304                 }
305
306                 [MonoTODO]
307                 public virtual string SetAttribute (string localName, string namespaceURI, string value)
308                 {
309                         throw new NotImplementedException ();
310                 }
311
312                 [MonoTODO]
313                 public virtual XmlAttribute SetAttributeNode (XmlAttribute newAttr)
314                 {
315                         newAttr.SetParentNode(this);
316                         XmlNode oldAttr = Attributes.SetNamedItem(newAttr);
317                         return oldAttr != null ? oldAttr as XmlAttribute : null;
318                 }
319
320                 
321                 public virtual XmlAttribute SetAttributeNode (string localName, string namespaceURI)
322                 {
323                         XmlDocument xmlDoc = this.OwnerDocument;\r
324                         XmlAttribute xmlAttribute = new XmlAttribute (String.Empty, localName, namespaceURI, xmlDoc);   \r
325                         return this.attributes.Append (xmlAttribute);
326                 }
327
328                 public override void WriteContentTo (XmlWriter w)
329                 {
330                         foreach(XmlNode childNode in ChildNodes)
331                                 childNode.WriteTo(w);
332                 }
333
334                 public override void WriteTo (XmlWriter w)
335                 {
336                         w.WriteStartElement(Prefix, LocalName, NamespaceURI);
337
338                         foreach(XmlNode attributeNode in Attributes)
339                                 attributeNode.WriteTo(w);
340
341                         WriteContentTo(w);
342
343                         w.WriteEndElement();
344                 }
345
346                 #endregion
347         }
348 }