2 // System.Xml.XmlAttribute
5 // Jason Diamond (jason@injektilo.org)
7 // (C) 2002 Jason Diamond http://injektilo.org/
11 using System.Collections;
15 public class XmlElement : XmlLinkedNode
19 private XmlAttributeCollection attributes;
20 private XmlLinkedNode lastLinkedChild;
21 private string localName;
22 private string namespaceURI;
23 private string prefix;
29 protected internal XmlElement (
33 XmlDocument doc) : base (doc)
36 this.localName = localName;
37 this.namespaceURI = namespaceURI;
39 attributes = new XmlAttributeCollection (this);
46 public override XmlAttributeCollection Attributes {
47 get { return attributes; }
50 public virtual bool HasAttributes {
51 get { return attributes.Count > 0; }
54 [MonoTODO ("Setter.")]
55 public override string InnerText {
57 // Not sure why this is an override. Passing through for now.
58 return base.InnerText;
60 set { throw new NotImplementedException (); }
63 [MonoTODO ("Setter is immature")]
64 public override string InnerXml {
66 // Not sure why this is an override. Passing through for now.
70 foreach(XmlNode n in ChildNodes)
75 // How to get xml:lang and xml:space? Create logic as ConstructNamespaceManager()?
76 XmlNameTable nt = this.OwnerDocument.NameTable;
77 XmlNamespaceManager nsmgr = this.ConstructNamespaceManager(); //new XmlNamespaceManager(nt);
79 XmlSpace space = XmlSpace.Default;
81 XmlParserContext ctx = new XmlParserContext(nt, nsmgr, lang, space);
82 XmlTextReader xmlReader = new XmlTextReader(value, this.NodeType, ctx);
83 this.ConstructDOM(xmlReader, this);
89 get { throw new NotImplementedException (); }
91 set { throw new NotImplementedException (); }
94 internal override XmlLinkedNode LastLinkedChild {
95 get { return lastLinkedChild; }
97 set { lastLinkedChild = value; }
100 public override string LocalName {
101 get { return localName; }
104 public override string Name {
106 return prefix != String.Empty ? prefix + ":" + localName : localName;
110 public override string NamespaceURI {
111 get { return namespaceURI; }
115 public override XmlNode NextSibling {
117 return base.NextSibling;
121 public override XmlNodeType NodeType {
123 return XmlNodeType.Element;
128 public override XmlDocument OwnerDocument {
130 return base.OwnerDocument;
134 public override string Prefix {
135 get { return prefix; }
136 set { prefix = value; }
144 public override XmlNode CloneNode (bool deep)
146 XmlNode node = new XmlElement (prefix, localName, namespaceURI,
149 for (int i = 0; i < node.Attributes.Count; i++)
150 node.AppendChild (node.Attributes [i].CloneNode (false));
153 while ((node != null) && (node.HasChildNodes)) {
154 AppendChild (node.NextSibling.CloneNode (true));
155 node = node.NextSibling;
160 // Reminder: Also look into Default attributes.
166 public virtual string GetAttribute (string name)
168 XmlNode attributeNode = Attributes.GetNamedItem (name);
169 return attributeNode != null ? attributeNode.Value : String.Empty;
173 public virtual string GetAttribute (string localName, string namespaceURI)
175 XmlNode attributeNode = Attributes.GetNamedItem (localName, namespaceURI);
176 return attributeNode != null ? attributeNode.Value : String.Empty;
180 public virtual XmlAttribute GetAttributeNode (string name)
182 XmlNode attributeNode = Attributes.GetNamedItem (name);
183 return attributeNode != null ? attributeNode as XmlAttribute : null;
187 public virtual XmlAttribute GetAttributeNode (string localName, string namespaceURI)
189 XmlNode attributeNode = Attributes.GetNamedItem (localName, namespaceURI);
190 return attributeNode != null ? attributeNode as XmlAttribute : null;
193 public virtual XmlNodeList GetElementsByTagName (string name)
195 ArrayList nodeArrayList = new ArrayList ();
196 this.searchNodesRecursively (this, name, nodeArrayList);
197 return new XmlNodeArrayList (nodeArrayList);
200 private void searchNodesRecursively (XmlNode argNode, string argName,
201 ArrayList argArrayList)
203 XmlNodeList xmlNodeList = argNode.ChildNodes;
204 foreach (XmlNode node in xmlNodeList){
205 if (node.Name.Equals (argName))
206 argArrayList.Add (node);
208 this.searchNodesRecursively (node, argName, argArrayList);
212 private void searchNodesRecursively (XmlNode argNode, string argName, string argNamespaceURI,
213 ArrayList argArrayList)
215 XmlNodeList xmlNodeList = argNode.ChildNodes;
216 foreach (XmlNode node in xmlNodeList)
218 if (node.LocalName.Equals (argName) && node.NamespaceURI.Equals (argNamespaceURI))
219 argArrayList.Add (node);
221 this.searchNodesRecursively (node, argName, argNamespaceURI, argArrayList);
225 public virtual XmlNodeList GetElementsByTagName (string localName, string namespaceURI)
227 ArrayList nodeArrayList = new ArrayList ();
228 this.searchNodesRecursively (this, localName, namespaceURI, nodeArrayList);
229 return new XmlNodeArrayList (nodeArrayList);
233 public virtual bool HasAttribute (string name)
235 XmlNode attributeNode = Attributes.GetNamedItem (name);
236 return attributeNode != null;
240 public virtual bool HasAttribute (string localName, string namespaceURI)
242 throw new NotImplementedException ();
245 [MonoTODO ("Don't remove default attributes.")]
246 public override void RemoveAll ()
248 // Remove the child nodes.
251 // Remove all attributes.
252 attributes.RemoveAll ();
255 public virtual void RemoveAllAttributes ()
257 attributes.RemoveAll ();
261 public virtual void RemoveAttribute (string name)
263 throw new NotImplementedException ();
267 public virtual void RemoveAttribute (string localName, string namespaceURI)
269 throw new NotImplementedException ();
273 public virtual XmlNode RemoveAttributeAt (int i)
275 throw new NotImplementedException ();
279 public virtual XmlAttribute RemoveAttributeNode (XmlAttribute oldAttr)
281 throw new NotImplementedException ();
285 public virtual XmlAttribute RemoveAttributeNode (string localName, string namespaceURI)
287 throw new NotImplementedException ();
291 public virtual void SetAttribute (string name, string value)
293 XmlAttribute attribute = OwnerDocument.CreateAttribute (name);
294 attribute.SetParentNode (this);
295 attribute.Value = value;
296 Attributes.SetNamedItem (attribute);
300 public virtual string SetAttribute (string localName, string namespaceURI, string value)
302 throw new NotImplementedException ();
306 public virtual XmlAttribute SetAttributeNode (XmlAttribute newAttr)
308 newAttr.SetParentNode(this);
309 XmlNode oldAttr = Attributes.SetNamedItem(newAttr);
310 return oldAttr != null ? oldAttr as XmlAttribute : null;
314 public virtual XmlAttribute SetAttributeNode (string localName, string namespaceURI)
316 XmlDocument xmlDoc = this.OwnerDocument;
\r
317 XmlAttribute xmlAttribute = new XmlAttribute (String.Empty, localName, namespaceURI, xmlDoc);
\r
318 return this.attributes.Append (xmlAttribute);
321 public override void WriteContentTo (XmlWriter w)
323 foreach(XmlNode childNode in ChildNodes)
324 childNode.WriteTo(w);
327 public override void WriteTo (XmlWriter w)
329 w.WriteStartElement(Prefix, LocalName, NamespaceURI);
331 foreach(XmlNode attributeNode in Attributes)
332 attributeNode.WriteTo(w);