2002-08-16 Jason Diamond <jason@injektilo.org>
[mono.git] / mcs / class / System.XML / System.Xml / XmlElement.cs
index 2e64a7ecec1d374e903d078849923b55683bad18..67f1070bc967b6445789804a9f323206b174d799 100644 (file)
-// -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-\r
-//\r
-// System.Xml.XmlElement\r
-//\r
-// Author:\r
-//   Daniel Weber (daniel-weber@austin.rr.com)\r
-//\r
-// (C) 2001 Daniel Weber\r
-using System;\r
-\r
-namespace System.Xml\r
-{\r
-       public class XmlElement : XmlLinkedNode\r
-       {\r
-               // Private/Protected internal data structures\r
-               //===========================================================================\r
-               private XmlAttributeCollection _attributes;\r
-\r
-               // Public Properties\r
-               //===========================================================================\r
-\r
-               /// <summary>\r
-               /// Return the XmlAttributeCollection on the Element\r
-               /// </summary>\r
-               public override XmlAttributeCollection Attributes \r
-               {\r
-                       get\r
-                       {\r
-                               // TODO - implement Attributes\r
-                               return _attributes;\r
-                       }\r
-               }\r
-\r
-               // Implement abstract methods of XmlNode\r
-               //=====================================================================\r
-               /// <summary>\r
-               /// Remove all children and attributes.  If \r
-               /// </summary>\r
-               public override void RemoveAll()\r
-               {\r
-                       // Remove all child nodes\r
-                       base.RemoveAll();\r
-\r
-                       // Remove all attributes\r
-                       _attributes.RemoveAll();\r
-\r
-                       // If we have any default attributes, add them back in with the\r
-                       //      appropriate namespace, baseURI, name, localName\r
-                       // TODO - implement adding default attributes back in XmlElement.RemoveAll()\r
-               }\r
-               \r
-               /// <summary>\r
-               /// Return a clone of the node\r
-               /// </summary>\r
-               /// <param name="deep">Make copy of all children</param>\r
-               /// <returns>Cloned node</returns>\r
-               public override XmlNode CloneNode( bool deep)\r
-               {\r
-                       // TODO - implement CloneNode()\r
-                       throw new NotImplementedException();\r
-               }\r
-\r
-               /// <summary>\r
-               /// Saves all children of the current node to the passed writer\r
-               /// </summary>\r
-               /// <param name="w"></param>\r
-               public override void WriteContentTo(XmlWriter w)\r
-               {\r
-                       // TODO - implement WriteContentsTo(XmlWriter)\r
-                       throw new NotImplementedException();\r
-               }\r
-\r
-               /// <summary>\r
-               /// Saves the current node to writer w\r
-               /// </summary>\r
-               /// <param name="w"></param>\r
-               public override void WriteTo(XmlWriter w)\r
-               {\r
-                       // TODO - implement WriteTo(XmlWriter)\r
-                       throw new NotImplementedException();\r
-               }\r
-\r
-               /// <summary>\r
-               /// Returns the local name of the node with qualifiers removed\r
-               /// LocalName of ns:elementName = "elementName"\r
-               /// </summary>\r
-               public override string LocalName \r
-               {\r
-                       get\r
-                       {\r
-                               // TODO - implement LocalName\r
-                               throw new NotImplementedException();\r
-                       }\r
-               }\r
-\r
-\r
-               /// <summary>\r
-               /// Get the qualified node name\r
-               /// derived classes must implement as behavior varies\r
-               /// by tag type.\r
-               /// </summary>\r
-               public override string Name \r
-               { \r
-                       get\r
-                       {\r
-                               // TODO - implement Name\r
-                               throw new NotImplementedException();\r
-                       }\r
-               }\r
-\r
-               public override XmlNodeType NodeType \r
-               {\r
-                       get\r
-                       {\r
-                               return XmlNodeType.Element;\r
-                       }\r
-               }\r
-\r
-\r
-               // ============= Internal calls =============================================\r
-\r
-               // Constructors\r
-               // ==========================================================================\r
-               internal XmlElement( XmlDocument aOwnerDoc ) : base(aOwnerDoc)\r
-               {\r
-                       _attributes = new XmlAttributeCollection(aOwnerDoc, this, null);\r
-               }\r
-\r
-\r
-               } // class\r
-       }  //namespace\r
+//
+// System.Xml.XmlAttribute
+//
+// Author:
+//   Jason Diamond (jason@injektilo.org)
+//
+// (C) 2002 Jason Diamond  http://injektilo.org/
+//
+
+using System;
+
+namespace System.Xml
+{
+       public class XmlElement : XmlLinkedNode
+       {
+               #region Fields
+
+               private XmlAttributeCollection attributes;
+               private XmlLinkedNode lastLinkedChild;
+               private string localName;
+               private string namespaceURI;
+               private string prefix;
+
+               #endregion
+
+               #region Constructor
+
+               protected internal XmlElement (
+                       string prefix, 
+                       string localName, 
+                       string namespaceURI, 
+                       XmlDocument doc) : base (doc)
+               {
+                       this.prefix = prefix;
+                       this.localName = localName;
+                       this.namespaceURI = namespaceURI;
+
+                       attributes = new XmlAttributeCollection (this);
+               }
+
+               #endregion
+
+               #region Properties
+
+               public override XmlAttributeCollection Attributes {
+                       get { return attributes; }
+               }
+
+               public virtual bool HasAttributes {
+                       get { return attributes.Count > 0; }
+               }
+
+               [MonoTODO ("Setter.")]
+               public override string InnerXml {
+                       get {
+                               // Not sure why this is an override.  Passing through for now.
+                               return base.InnerXml;
+                       }
+                       set { throw new NotImplementedException (); }
+               }
+
+               [MonoTODO]
+               public bool IsEmpty {
+                       get { throw new NotImplementedException (); }
+
+                       set { throw new NotImplementedException (); }
+               }
+
+               internal override XmlLinkedNode LastLinkedChild {
+                       get { return lastLinkedChild; }
+
+                       set { lastLinkedChild = value; }
+               }
+               
+               public override string LocalName {
+                       get { return localName; }
+               }
+
+               public override string Name {
+                       get { 
+                               return prefix != String.Empty ? prefix + ":" + localName : localName; 
+                       }
+               }
+
+               public override string NamespaceURI {
+                       get { return namespaceURI; }
+               }
+
+               [MonoTODO]
+               public override XmlNode NextSibling {
+                       get { 
+                               return base.NextSibling; 
+                       }
+               }
+
+               public override XmlNodeType NodeType {
+                       get { 
+                               return XmlNodeType.Element; 
+                       }
+               }
+
+               [MonoTODO]
+               public override XmlDocument OwnerDocument {
+                       get { 
+                               return base.OwnerDocument; 
+                       }
+               }
+
+               public override string Prefix {
+                       get { 
+                               return prefix; 
+                       }
+               }
+
+               #endregion
+
+               #region Methods
+               
+               [MonoTODO]
+               public override XmlNode CloneNode (bool deep)
+               {
+                       XmlNode node =  new XmlElement (prefix, localName, namespaceURI,
+                                                       OwnerDocument);
+
+                       for (int i = 0; i < node.Attributes.Count; i++)
+                               node.AppendChild (node.Attributes [i].CloneNode (false));
+                       
+                       if (deep) {
+                               while ((node != null) && (node.HasChildNodes)) {                                        
+                                       AppendChild (node.NextSibling.CloneNode (true));
+                                       node = node.NextSibling;
+                               }
+                       } // shallow cloning
+                               
+                       //
+                       // Reminder: Also look into Default attributes.
+                       //
+                       return node;
+               }
+
+               [MonoTODO]
+               public virtual string GetAttribute (string name)
+               {
+                       XmlNode attributeNode = Attributes.GetNamedItem (name);
+                       return attributeNode != null ? attributeNode.Value : String.Empty;
+               }
+
+               [MonoTODO]
+               public virtual string GetAttribute (string localName, string namespaceURI)
+               {
+                       XmlNode attributeNode = Attributes.GetNamedItem (localName, namespaceURI);
+                       return attributeNode != null ? attributeNode.Value : String.Empty;
+               }
+
+               [MonoTODO]
+               public virtual XmlAttribute GetAttributeNode (string name)
+               {
+                       XmlNode attributeNode = Attributes.GetNamedItem (name);
+                       return attributeNode != null ? attributeNode as XmlAttribute : null;
+               }
+
+               [MonoTODO]
+               public virtual XmlAttribute GetAttributeNode (string localName, string namespaceURI)
+               {
+                       XmlNode attributeNode = Attributes.GetNamedItem (localName, namespaceURI);
+                       return attributeNode != null ? attributeNode as XmlAttribute : null;
+               }
+
+               [MonoTODO]
+               public virtual XmlNodeList GetElementsByTagName (string name)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               [MonoTODO]
+               public virtual XmlNodeList GetElementsByTagName (string localName, string namespaceURI)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               [MonoTODO]
+               public virtual bool HasAttribute (string name)
+               {
+                       XmlNode attributeNode = Attributes.GetNamedItem (name);
+                       return attributeNode != null;
+               }
+
+               [MonoTODO]
+               public virtual bool HasAttribute (string localName, string namespaceURI)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               [MonoTODO ("Don't remove default attributes.")]
+               public override void RemoveAll ()
+               {
+                       // Remove the child nodes.
+                       base.RemoveAll ();
+
+                       // Remove all attributes.
+                       attributes.RemoveAll ();
+               }
+
+               [MonoTODO]
+               public virtual void RemoveAllAttributes ()
+               {
+                       throw new NotImplementedException ();
+               }
+
+               [MonoTODO]
+               public virtual void RemoveAttribute (string name)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               [MonoTODO]
+               public virtual void RemoveAttribute (string localName, string namespaceURI)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               [MonoTODO]
+               public virtual XmlNode RemoveAttributeAt (int i)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               [MonoTODO]
+               public virtual XmlAttribute RemoveAttributeNode (XmlAttribute oldAttr)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               [MonoTODO]
+               public virtual XmlAttribute RemoveAttributeNode (string localName, string namespaceURI)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               [MonoTODO]
+               public virtual void SetAttribute (string name, string value)
+               {
+                       XmlAttribute attribute = OwnerDocument.CreateAttribute (name);
+                       attribute.SetParentNode (this);
+                       attribute.Value = value;
+                       Attributes.SetNamedItem (attribute);
+               }
+
+               [MonoTODO]
+               public virtual string SetAttribute (string localName, string namespaceURI, string value)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               [MonoTODO]
+               public virtual XmlAttribute SetAttributeNode (XmlAttribute newAttr)
+               {
+                       newAttr.SetParentNode(this);
+                       XmlNode oldAttr = Attributes.SetNamedItem(newAttr);
+                       return oldAttr != null ? oldAttr as XmlAttribute : null;
+               }
+
+               [MonoTODO]
+               public virtual XmlAttribute SetAttributeNode (string localName, string namespaceURI)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               public override void WriteContentTo (XmlWriter w)
+               {
+                       foreach(XmlNode childNode in ChildNodes)
+                               childNode.WriteTo(w);
+               }
+
+               public override void WriteTo (XmlWriter w)
+               {
+                       w.WriteStartElement(Prefix, LocalName, NamespaceURI);
+
+                       foreach(XmlNode attributeNode in Attributes)
+                               attributeNode.WriteTo(w);
+
+                       WriteContentTo(w);
+
+                       w.WriteEndElement();
+               }
+
+               #endregion
+       }
+}