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