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 XmlLinkedNode lastLinkedChild;
22 private string localName;
23 private string namespaceURI;
24 private string prefix;
30 protected internal XmlElement (
34 XmlDocument doc) : base (doc)
37 this.localName = localName;
38 this.namespaceURI = namespaceURI;
40 attributes = new XmlAttributeCollection (this);
47 public override XmlAttributeCollection Attributes {
48 get { return attributes; }
51 public virtual bool HasAttributes {
52 get { return attributes.Count > 0; }
55 [MonoTODO ("Setter.")]
56 public override string InnerText {
58 // Not sure why this is an override. Passing through for now.
59 return base.InnerText;
61 set { throw new NotImplementedException (); }
64 [MonoTODO ("Setter is immature")]
65 public override string InnerXml {
67 // Not sure why this is an override. Passing through for now.
71 foreach(XmlNode n in ChildNodes)
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);
80 XmlSpace space = XmlSpace.Default;
82 XmlParserContext ctx = new XmlParserContext(nt, nsmgr, lang, space);
83 XmlTextReader xmlReader = new XmlTextReader(value, this.NodeType, ctx);
84 this.ConstructDOM(xmlReader, this);
90 get { throw new NotImplementedException (); }
92 set { throw new NotImplementedException (); }
95 internal override XmlLinkedNode LastLinkedChild {
96 get { return lastLinkedChild; }
98 set { lastLinkedChild = value; }
101 public override string LocalName {
102 get { return localName; }
105 public override string Name {
107 return prefix != String.Empty ? prefix + ":" + localName : localName;
111 public override string NamespaceURI {
112 get { return namespaceURI; }
116 public override XmlNode NextSibling {
118 return base.NextSibling;
122 public override XmlNodeType NodeType {
124 return XmlNodeType.Element;
128 internal override XPathNodeType XPathNodeType {
130 return XPathNodeType.Element;
135 public override XmlDocument OwnerDocument {
137 return base.OwnerDocument;
141 public override string Prefix {
142 get { return prefix; }
143 set { prefix = value; }
151 public override XmlNode CloneNode (bool deep)
153 XmlNode node = new XmlElement (prefix, localName, namespaceURI,
156 for (int i = 0; i < node.Attributes.Count; i++)
157 node.AppendChild (node.Attributes [i].CloneNode (false));
160 while ((node != null) && (node.HasChildNodes)) {
161 AppendChild (node.NextSibling.CloneNode (true));
162 node = node.NextSibling;
167 // Reminder: Also look into Default attributes.
173 public virtual string GetAttribute (string name)
175 XmlNode attributeNode = Attributes.GetNamedItem (name);
176 return attributeNode != null ? attributeNode.Value : String.Empty;
180 public virtual string GetAttribute (string localName, string namespaceURI)
182 XmlNode attributeNode = Attributes.GetNamedItem (localName, namespaceURI);
183 return attributeNode != null ? attributeNode.Value : String.Empty;
187 public virtual XmlAttribute GetAttributeNode (string name)
189 XmlNode attributeNode = Attributes.GetNamedItem (name);
190 return attributeNode != null ? attributeNode as XmlAttribute : null;
194 public virtual XmlAttribute GetAttributeNode (string localName, string namespaceURI)
196 XmlNode attributeNode = Attributes.GetNamedItem (localName, namespaceURI);
197 return attributeNode != null ? attributeNode as XmlAttribute : null;
200 public virtual XmlNodeList GetElementsByTagName (string name)
202 ArrayList nodeArrayList = new ArrayList ();
203 this.searchNodesRecursively (this, name, nodeArrayList);
204 return new XmlNodeArrayList (nodeArrayList);
207 private void searchNodesRecursively (XmlNode argNode, string argName,
208 ArrayList argArrayList)
210 XmlNodeList xmlNodeList = argNode.ChildNodes;
211 foreach (XmlNode node in xmlNodeList){
212 if (node.Name.Equals (argName))
213 argArrayList.Add (node);
215 this.searchNodesRecursively (node, argName, argArrayList);
219 private void searchNodesRecursively (XmlNode argNode, string argName, string argNamespaceURI,
220 ArrayList argArrayList)
222 XmlNodeList xmlNodeList = argNode.ChildNodes;
223 foreach (XmlNode node in xmlNodeList)
225 if (node.LocalName.Equals (argName) && node.NamespaceURI.Equals (argNamespaceURI))
226 argArrayList.Add (node);
228 this.searchNodesRecursively (node, argName, argNamespaceURI, argArrayList);
232 public virtual XmlNodeList GetElementsByTagName (string localName, string namespaceURI)
234 ArrayList nodeArrayList = new ArrayList ();
235 this.searchNodesRecursively (this, localName, namespaceURI, nodeArrayList);
236 return new XmlNodeArrayList (nodeArrayList);
240 public virtual bool HasAttribute (string name)
242 XmlNode attributeNode = Attributes.GetNamedItem (name);
243 return attributeNode != null;
247 public virtual bool HasAttribute (string localName, string namespaceURI)
249 throw new NotImplementedException ();
252 [MonoTODO ("Don't remove default attributes.")]
253 public override void RemoveAll ()
255 // Remove the child nodes.
258 // Remove all attributes.
259 attributes.RemoveAll ();
262 public virtual void RemoveAllAttributes ()
264 attributes.RemoveAll ();
268 public virtual void RemoveAttribute (string name)
270 throw new NotImplementedException ();
274 public virtual void RemoveAttribute (string localName, string namespaceURI)
276 throw new NotImplementedException ();
280 public virtual XmlNode RemoveAttributeAt (int i)
282 throw new NotImplementedException ();
286 public virtual XmlAttribute RemoveAttributeNode (XmlAttribute oldAttr)
288 throw new NotImplementedException ();
292 public virtual XmlAttribute RemoveAttributeNode (string localName, string namespaceURI)
294 throw new NotImplementedException ();
298 public virtual void SetAttribute (string name, string value)
300 XmlAttribute attribute = OwnerDocument.CreateAttribute (name);
301 attribute.SetParentNode (this);
302 attribute.Value = value;
303 Attributes.SetNamedItem (attribute);
307 public virtual string SetAttribute (string localName, string namespaceURI, string value)
309 throw new NotImplementedException ();
313 public virtual XmlAttribute SetAttributeNode (XmlAttribute newAttr)
315 newAttr.SetParentNode(this);
316 XmlNode oldAttr = Attributes.SetNamedItem(newAttr);
317 return oldAttr != null ? oldAttr as XmlAttribute : null;
321 public virtual XmlAttribute SetAttributeNode (string localName, string namespaceURI)
323 XmlDocument xmlDoc = this.OwnerDocument;
\r
324 XmlAttribute xmlAttribute = new XmlAttribute (String.Empty, localName, namespaceURI, xmlDoc);
\r
325 return this.attributes.Append (xmlAttribute);
328 public override void WriteContentTo (XmlWriter w)
330 foreach(XmlNode childNode in ChildNodes)
331 childNode.WriteTo(w);
334 public override void WriteTo (XmlWriter w)
336 w.WriteStartElement(Prefix, LocalName, NamespaceURI);
338 foreach(XmlNode attributeNode in Attributes)
339 attributeNode.WriteTo(w);