2 // System.Xml.XmlAttribute
5 // Jason Diamond (jason@injektilo.org)
7 // (C) 2002 Jason Diamond http://injektilo.org/
11 using System.Collections;
12 using System.Xml.XPath;
16 public class XmlElement : XmlLinkedNode
20 private XmlAttributeCollection attributes;
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);
41 // Adds default attributes
42 if(doc.DocumentType != null)
51 public override XmlAttributeCollection Attributes {
52 get { return attributes; }
55 public virtual bool HasAttributes {
56 get { return attributes.Count > 0; }
59 [MonoTODO ("Setter.")]
60 public override string InnerText {
62 // Not sure why this is an override. Passing through for now.
63 return base.InnerText;
65 set { throw new NotImplementedException (); }
68 [MonoTODO ("Setter is immature")]
69 public override string InnerXml {
71 // Not sure why this is an override. Passing through for now.
75 foreach(XmlNode n in ChildNodes)
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);
84 XmlSpace space = XmlSpace.Default;
86 XmlParserContext ctx = new XmlParserContext(nt, nsmgr, lang, space);
87 XmlTextReader xmlReader = new XmlTextReader(value, this.NodeType, ctx);
88 this.ConstructDOM(xmlReader, this);
94 get { throw new NotImplementedException (); }
96 set { throw new NotImplementedException (); }
99 public override string LocalName {
100 get { return localName; }
103 public override string Name {
105 return prefix != String.Empty ? prefix + ":" + localName : localName;
109 public override string NamespaceURI {
110 get { return namespaceURI; }
114 public override XmlNode NextSibling {
116 return base.NextSibling;
120 public override XmlNodeType NodeType {
122 return XmlNodeType.Element;
126 internal override XPathNodeType XPathNodeType {
128 return XPathNodeType.Element;
133 public override XmlDocument OwnerDocument {
135 return base.OwnerDocument;
139 public override string Prefix {
140 get { return prefix; }
141 set { prefix = value; }
149 public override XmlNode CloneNode (bool deep)
151 XmlNode node = new XmlElement (prefix, localName, namespaceURI,
154 for (int i = 0; i < node.Attributes.Count; i++)
155 node.AppendChild (node.Attributes [i].CloneNode (false));
158 while ((node != null) && (node.HasChildNodes)) {
159 AppendChild (node.NextSibling.CloneNode (true));
160 node = node.NextSibling;
165 // Reminder: Also look into Default attributes.
171 public virtual string GetAttribute (string name)
173 XmlNode attributeNode = Attributes.GetNamedItem (name);
174 return attributeNode != null ? attributeNode.Value : String.Empty;
178 public virtual string GetAttribute (string localName, string namespaceURI)
180 XmlNode attributeNode = Attributes.GetNamedItem (localName, namespaceURI);
181 return attributeNode != null ? attributeNode.Value : String.Empty;
185 public virtual XmlAttribute GetAttributeNode (string name)
187 XmlNode attributeNode = Attributes.GetNamedItem (name);
188 return attributeNode != null ? attributeNode as XmlAttribute : null;
192 public virtual XmlAttribute GetAttributeNode (string localName, string namespaceURI)
194 XmlNode attributeNode = Attributes.GetNamedItem (localName, namespaceURI);
195 return attributeNode != null ? attributeNode as XmlAttribute : null;
198 public virtual XmlNodeList GetElementsByTagName (string name)
200 ArrayList nodeArrayList = new ArrayList ();
201 this.searchNodesRecursively (this, name, nodeArrayList);
202 return new XmlNodeArrayList (nodeArrayList);
205 private void searchNodesRecursively (XmlNode argNode, string argName,
206 ArrayList argArrayList)
208 XmlNodeList xmlNodeList = argNode.ChildNodes;
209 foreach (XmlNode node in xmlNodeList){
210 if (node.Name.Equals (argName))
211 argArrayList.Add (node);
213 this.searchNodesRecursively (node, argName, argArrayList);
217 private void searchNodesRecursively (XmlNode argNode, string argName, string argNamespaceURI,
218 ArrayList argArrayList)
220 XmlNodeList xmlNodeList = argNode.ChildNodes;
221 foreach (XmlNode node in xmlNodeList)
223 if (node.LocalName.Equals (argName) && node.NamespaceURI.Equals (argNamespaceURI))
224 argArrayList.Add (node);
226 this.searchNodesRecursively (node, argName, argNamespaceURI, argArrayList);
230 public virtual XmlNodeList GetElementsByTagName (string localName, string namespaceURI)
232 ArrayList nodeArrayList = new ArrayList ();
233 this.searchNodesRecursively (this, localName, namespaceURI, nodeArrayList);
234 return new XmlNodeArrayList (nodeArrayList);
238 public virtual bool HasAttribute (string name)
240 XmlNode attributeNode = Attributes.GetNamedItem (name);
241 return attributeNode != null;
245 public virtual bool HasAttribute (string localName, string namespaceURI)
247 throw new NotImplementedException ();
250 [MonoTODO ("Don't remove default attributes.")]
251 public override void RemoveAll ()
253 // Remove the child nodes.
256 // Remove all attributes.
257 attributes.RemoveAll ();
260 [MonoTODO ("Don't remove default attributes.")]
261 public virtual void RemoveAllAttributes ()
263 attributes.RemoveAll ();
267 public virtual void RemoveAttribute (string name)
269 throw new NotImplementedException ();
273 public virtual void RemoveAttribute (string localName, string namespaceURI)
275 throw new NotImplementedException ();
279 public virtual XmlNode RemoveAttributeAt (int i)
281 throw new NotImplementedException ();
285 public virtual XmlAttribute RemoveAttributeNode (XmlAttribute oldAttr)
287 throw new NotImplementedException ();
291 public virtual XmlAttribute RemoveAttributeNode (string localName, string namespaceURI)
293 throw new NotImplementedException ();
297 public virtual void SetAttribute (string name, string value)
299 XmlAttribute attribute = OwnerDocument.CreateAttribute (name);
300 attribute.SetParentNode (this);
301 attribute.Value = value;
302 Attributes.SetNamedItem (attribute);
306 public virtual string SetAttribute (string localName, string namespaceURI, string value)
308 throw new NotImplementedException ();
312 public virtual XmlAttribute SetAttributeNode (XmlAttribute newAttr)
314 newAttr.SetParentNode(this);
315 XmlNode oldAttr = Attributes.SetNamedItem(newAttr);
316 return oldAttr != null ? oldAttr as XmlAttribute : null;
320 public virtual XmlAttribute SetAttributeNode (string localName, string namespaceURI)
322 XmlDocument xmlDoc = this.OwnerDocument;
323 XmlAttribute xmlAttribute = new XmlAttribute (String.Empty, localName, namespaceURI, xmlDoc);
324 return this.attributes.Append (xmlAttribute);
327 public override void WriteContentTo (XmlWriter w)
329 foreach(XmlNode childNode in ChildNodes)
330 childNode.WriteTo(w);
333 public override void WriteTo (XmlWriter w)
335 w.WriteStartElement(Prefix, LocalName, NamespaceURI);
337 foreach(XmlNode attributeNode in Attributes)
338 attributeNode.WriteTo(w);