X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem.XML%2FSystem.Xml%2FXmlElement.cs;h=6b6fd2838b8e06b11f48d2df56ea53c6d1970595;hb=4477135bd8e477678d3ddaa4b508ff780b9e0a47;hp=b4dac1e5a46a6e275efa4895f0937f53b92e62d1;hpb=b85325090c44995ea0a8155ef09aef8caac8520d;p=mono.git diff --git a/mcs/class/System.XML/System.Xml/XmlElement.cs b/mcs/class/System.XML/System.Xml/XmlElement.cs index b4dac1e5a46..6b6fd2838b8 100644 --- a/mcs/class/System.XML/System.Xml/XmlElement.cs +++ b/mcs/class/System.XML/System.Xml/XmlElement.cs @@ -2,11 +2,18 @@ // System.Xml.XmlElement // // Author: -// Daniel Weber (daniel-weber@austin.rr.com) +// Jason Diamond (jason@injektilo.org) +// Atsushi Enomoto (ginga@kit.hi-ho.ne.jp) +// +// (C) 2002 Jason Diamond http://injektilo.org/ +// (C) 2002 Atsushi Enomoto // -// (C) 2001 Daniel Weber using System; +using System.Collections; +using System.Xml.XPath; +using System.IO; +using System.Text; namespace System.Xml { @@ -18,110 +25,164 @@ namespace System.Xml private string localName; private string namespaceURI; private string prefix; + private bool isEmpty; #endregion #region Constructor - protected internal XmlElement(string prefix, string localName, string namespaceURI, XmlDocument doc) : base(doc) + 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); + attributes = new XmlAttributeCollection (this); + + // TODO: Adds default attributes + if(doc.DocumentType != null) + { + } } #endregion #region Properties - public override XmlAttributeCollection Attributes - { + public override XmlAttributeCollection Attributes { get { return attributes; } } - public virtual bool HasAttributes - { + public virtual bool HasAttributes { get { return attributes.Count > 0; } } - [MonoTODO] - public override string InnerText - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } + public override string InnerText { + get { + return base.InnerText; + } + set { + // Why its behavior (of MS FCL) is different from InnerXml...? + if (FirstChild != null && FirstChild.NodeType == XmlNodeType.Text) + FirstChild.Value = value; + else { + if(FirstChild != null) { + foreach (XmlNode n in ChildNodes) + this.RemoveChild (n); + } + // creates new Text node + AppendChild(OwnerDocument.CreateTextNode(value)); + } + } } - [MonoTODO] - public override string InnerXml - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } + public override string InnerXml { + get { + return base.InnerXml; + } + set { + foreach(XmlNode n in ChildNodes) + this.RemoveChild(n); + + // I hope there are any well-performance logic... + XmlNameTable nt = this.OwnerDocument.NameTable; + XmlNamespaceManager nsmgr = this.ConstructNamespaceManager (); + XmlParserContext ctx = new XmlParserContext (nt, nsmgr, XmlLang, this.XmlSpace); + XmlTextReader xmlReader = OwnerDocument.ReusableReader; + xmlReader.SetReaderContext (String.Empty, ctx); + xmlReader.SetReaderFragment (new StringReader (value), XmlNodeType.Element); + + do { + XmlNode n = OwnerDocument.ReadNode (xmlReader); + if(n == null) break; + AppendChild (n); + } while (true); + } } - [MonoTODO] - public bool IsEmpty - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } + public bool IsEmpty { + get { return isEmpty; } + + set { + if(value) + RemoveAll(); + isEmpty = value; + } } - public override string LocalName - { + public override string LocalName { get { return localName; } } - public override string Name - { - get { return prefix != String.Empty ? prefix + ":" + localName : localName; } + public override string Name { + get { + return prefix != String.Empty ? prefix + ":" + localName : localName; + } } - public override string NamespaceURI - { + public override string NamespaceURI { get { return namespaceURI; } } - [MonoTODO()] - public override XmlNode NextSibling - { - get { return base.NextSibling; } + [MonoTODO] + public override XmlNode NextSibling { + get { + return base.NextSibling; + } } - public override XmlNodeType NodeType - { - get { return XmlNodeType.Element; } + public override XmlNodeType NodeType { + get { + return XmlNodeType.Element; + } } - public override string Prefix - { - get { return prefix; } + internal override XPathNodeType XPathNodeType { + get { + return XPathNodeType.Element; + } } [MonoTODO] - public override XmlDocument OwnerDocument - { - get { return base.OwnerDocument; } + public override XmlDocument OwnerDocument { + get { + return base.OwnerDocument; + } } - public override string Value - { - get { return null; } - - set - { - // Do nothing. - } + public override string Prefix { + get { return prefix; } + set { prefix = value; } } #endregion #region Methods - + [MonoTODO] public override XmlNode CloneNode (bool deep) { - throw new NotImplementedException(); + 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] @@ -132,129 +193,189 @@ namespace System.Xml } [MonoTODO] - public virtual string GetAttribute(string localName, string namespaceURI) + public virtual string GetAttribute (string localName, string namespaceURI) { - throw new NotImplementedException(); + XmlNode attributeNode = Attributes.GetNamedItem (localName, namespaceURI); + return attributeNode != null ? attributeNode.Value : String.Empty; } [MonoTODO] - public virtual XmlAttribute GetAttributeNode(string name) + public virtual XmlAttribute GetAttributeNode (string name) { - throw new NotImplementedException(); + XmlNode attributeNode = Attributes.GetNamedItem (name); + return attributeNode != null ? attributeNode as XmlAttribute : null; } [MonoTODO] - public virtual XmlAttribute GetAttributeNode(string localName, string namespaceURI) + public virtual XmlAttribute GetAttributeNode (string localName, string namespaceURI) { - throw new NotImplementedException(); + XmlNode attributeNode = Attributes.GetNamedItem (localName, namespaceURI); + return attributeNode != null ? attributeNode as XmlAttribute : null; } - [MonoTODO] - public virtual XmlNodeList GetElementsByTagName(string name) + public virtual XmlNodeList GetElementsByTagName (string name) { - throw new NotImplementedException(); + ArrayList nodeArrayList = new ArrayList (); + this.searchNodesRecursively (this, name, nodeArrayList); + return new XmlNodeArrayList (nodeArrayList); } - [MonoTODO] - public virtual XmlNodeList GetElementsByTagName(string localName, string namespaceURI) + private void searchNodesRecursively (XmlNode argNode, string argName, + ArrayList argArrayList) { - throw new NotImplementedException(); + XmlNodeList xmlNodeList = argNode.ChildNodes; + foreach (XmlNode node in xmlNodeList){ + if (node.Name.Equals (argName)) + argArrayList.Add (node); + else + this.searchNodesRecursively (node, argName, argArrayList); + } + } + + private void searchNodesRecursively (XmlNode argNode, string argName, string argNamespaceURI, + ArrayList argArrayList) + { + XmlNodeList xmlNodeList = argNode.ChildNodes; + foreach (XmlNode node in xmlNodeList) + { + if (node.LocalName.Equals (argName) && node.NamespaceURI.Equals (argNamespaceURI)) + argArrayList.Add (node); + else + this.searchNodesRecursively (node, argName, argNamespaceURI, argArrayList); + } + } + + public virtual XmlNodeList GetElementsByTagName (string localName, string namespaceURI) + { + ArrayList nodeArrayList = new ArrayList (); + this.searchNodesRecursively (this, localName, namespaceURI, nodeArrayList); + return new XmlNodeArrayList (nodeArrayList); } [MonoTODO] - public virtual bool HasAttribute(string name) + public virtual bool HasAttribute (string name) { - throw new NotImplementedException(); + XmlNode attributeNode = Attributes.GetNamedItem (name); + return attributeNode != null; } [MonoTODO] - public virtual bool HasAttribute(string localName, string namespaceURI) + public virtual bool HasAttribute (string localName, string namespaceURI) { - throw new NotImplementedException(); + XmlNode attributeNode = Attributes.GetNamedItem (localName, namespaceURI); + return attributeNode != null; } - [MonoTODO("Don't remove default attributes.")] - public override void RemoveAll() + [MonoTODO ("confirm not removing default attributes [when DTD feature was implemented.")] + public override void RemoveAll () { // Remove the child nodes. - base.RemoveAll(); + base.RemoveAll (); // Remove all attributes. - attributes.RemoveAll(); + attributes.RemoveAll (); } - [MonoTODO] - public virtual void RemoveAllAttributes() + [MonoTODO ("confirm not removing default attributes [when DTD feature was implemented.")] + public virtual void RemoveAllAttributes () { - throw new NotImplementedException(); + attributes.RemoveAll (); } - [MonoTODO] - public virtual void RemoveAttribute(string name) + [MonoTODO ("confirm not resetting default attributes [when DTD feature was implemented.")] + public virtual void RemoveAttribute (string name) { - throw new NotImplementedException(); + attributes.Remove((XmlAttribute)attributes.GetNamedItem(name)); } - [MonoTODO] - public virtual void RemoveAttribute(string localName, string namespaceURI) + [MonoTODO ("confirm not resetting default attributes [when DTD feature was implemented.")] + public virtual void RemoveAttribute (string localName, string namespaceURI) { - throw new NotImplementedException(); + attributes.Remove((XmlAttribute)attributes.GetNamedItem(localName, namespaceURI)); } - [MonoTODO] - public virtual XmlNode RemoveAttributeAt(int i) + [MonoTODO ("confirm not resetting default attributes [when DTD feature was implemented.")] + public virtual XmlNode RemoveAttributeAt (int i) { - throw new NotImplementedException(); + return attributes.Remove(attributes[i]); } - [MonoTODO] - public virtual XmlAttribute RemoveAttributeNode(XmlAttribute oldAttr) + [MonoTODO ("confirm not resetting default attributes [when DTD feature was implemented.")] + public virtual XmlAttribute RemoveAttributeNode (XmlAttribute oldAttr) { - throw new NotImplementedException(); + return attributes.Remove(oldAttr); } - [MonoTODO] - public virtual XmlAttribute RemoveAttributeNode(string localName, string namespaceURI) + [MonoTODO ("confirm not resetting default attributes [when DTD feature was implemented.")] + public virtual XmlAttribute RemoveAttributeNode (string localName, string namespaceURI) { - throw new NotImplementedException(); + return attributes.Remove(attributes[localName, namespaceURI]); } [MonoTODO] - public virtual void SetAttribute(string name, string value) + public virtual void SetAttribute (string name, string value) { XmlAttribute attribute = OwnerDocument.CreateAttribute (name); + attribute.SetOwnerElement(this); attribute.Value = value; Attributes.SetNamedItem (attribute); } - [MonoTODO] - public virtual void SetAttribute(string localName, string namespaceURI, string value) +// [MonoTODO] + public virtual string SetAttribute (string localName, string namespaceURI, string value) { - throw new NotImplementedException(); + XmlAttribute attr = attributes[localName, namespaceURI]; + if(attr == null) + { + attr = OwnerDocument.CreateAttribute(localName, namespaceURI); + attr.Value = value; + attributes.SetNamedItem(attr); + } + else + attr.Value = value; + return attr.Value; } - [MonoTODO] - public virtual XmlAttribute SetAttributeNode(XmlAttribute newAttr) +// [MonoTODO] + public virtual XmlAttribute SetAttributeNode (XmlAttribute newAttr) { - throw new NotImplementedException(); + newAttr.SetOwnerElement(this); + XmlNode oldAttr = Attributes.SetNamedItem(newAttr); + return oldAttr != null ? oldAttr as XmlAttribute : null; } - [MonoTODO] - public virtual XmlAttribute SetAttributeNode(string localName, string namespaceURI) + public virtual XmlAttribute SetAttributeNode (string localName, string namespaceURI) { - throw new NotImplementedException(); + XmlDocument xmlDoc = this.OwnerDocument; + XmlAttribute xmlAttribute = new XmlAttribute (String.Empty, localName, namespaceURI, xmlDoc); + return this.attributes.Append (xmlAttribute); } - [MonoTODO] - public override void WriteContentTo(XmlWriter w) + public override void WriteContentTo (XmlWriter w) { - throw new NotImplementedException(); + foreach(XmlNode childNode in ChildNodes) + childNode.WriteTo(w); } [MonoTODO] - public override void WriteTo(XmlWriter w) + public override void WriteTo (XmlWriter w) { - throw new NotImplementedException(); + w.WriteStartElement(Prefix, LocalName, NamespaceURI); + + foreach(XmlNode attributeNode in Attributes) + attributeNode.WriteTo(w); + + // write namespace declarations(if not exist) + foreach(XmlNode attributeNode in Attributes) { + if(attributeNode.Prefix != null && attributeNode.Prefix != String.Empty && + w.LookupPrefix(attributeNode.Prefix) != attributeNode.NamespaceURI && + attributeNode.Prefix != "xmlns") + w.WriteAttributeString("xmlns", attributeNode.Prefix, "http://www.w3.org/2000/xmlns/", attributeNode.NamespaceURI); + } + + WriteContentTo(w); + + w.WriteEndElement(); } #endregion