XmlElement.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Xml / System / Xml / Dom / XmlElement.cs / 1305376 / XmlElement.cs

                            //------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// [....] 
//-----------------------------------------------------------------------------
 
using System; 
using System.Xml.Schema;
using System.Xml.XPath; 
using System.Collections;
using System.Diagnostics;
using System.Globalization;
 
namespace System.Xml {
    // Represents an element. 
    public class XmlElement : XmlLinkedNode { 
        XmlName name;
        XmlAttributeCollection attributes; 
        XmlLinkedNode lastChild; // == this for empty elements otherwise it is the last child

        internal XmlElement( XmlName name, bool empty, XmlDocument doc ): base( doc ) {
            Debug.Assert(name!=null); 
            this.parentNode = null;
            if ( !doc.IsLoading ) { 
                XmlDocument.CheckName( name.Prefix ); 
                XmlDocument.CheckName( name.LocalName );
            } 
            if (name.LocalName.Length == 0)
                throw new ArgumentException(Res.GetString(Res.Xdom_Empty_LocalName));
            this.name = name;
            if (empty) { 
                this.lastChild = this;
            } 
        } 

        protected internal XmlElement( string prefix, string localName, string namespaceURI, XmlDocument doc ) 
        : this( doc.AddXmlName( prefix, localName, namespaceURI, null ), true, doc ) {
        }

        internal XmlName XmlName { 
            get { return name; }
            set { name = value; } 
        } 

        // Creates a duplicate of this node. 
        public override XmlNode CloneNode(bool deep) {
            Debug.Assert( OwnerDocument != null );
            XmlDocument doc = OwnerDocument;
            bool OrigLoadingStatus = doc.IsLoading; 
            doc.IsLoading = true;
            XmlElement element = doc.CreateElement( Prefix, LocalName, NamespaceURI ); 
            doc.IsLoading = OrigLoadingStatus; 
            if ( element.IsEmpty != this.IsEmpty )
                element.IsEmpty = this.IsEmpty; 

            if (HasAttributes) {
                foreach( XmlAttribute attr in Attributes ) {
                    XmlAttribute newAttr = (XmlAttribute)(attr.CloneNode(true)); 
                    if (attr is XmlUnspecifiedAttribute && attr.Specified == false)
                        ( ( XmlUnspecifiedAttribute )newAttr).SetSpecified(false); 
                    element.Attributes.InternalAppendAttribute( newAttr ); 
                }
            } 
            if (deep)
                element.CopyChildren( doc, this, deep );

            return element; 
        }
 
        // Gets the name of the node. 
        public override string Name {
            get { return name.Name;} 
        }

        // Gets the name of the current node without the namespace prefix.
        public override string LocalName { 
            get { return name.LocalName;}
        } 
 
        // Gets the namespace URI of this node.
        public override string NamespaceURI { 
            get { return name.NamespaceURI;}
        }

        // Gets or sets the namespace prefix of this node. 
        public override string Prefix {
            get { return name.Prefix;} 
            set { name = name.OwnerDocument.AddXmlName( value, LocalName, NamespaceURI, SchemaInfo ); } 
        }
 
        // Gets the type of the current node.
        public override XmlNodeType NodeType {
            get { return XmlNodeType.Element;}
        } 

        public override XmlNode ParentNode { 
            get { 
                return this.parentNode;
            } 
        }

        // Gets the XmlDocument that contains this node.
        public override XmlDocument OwnerDocument { 
            get {
                return name.OwnerDocument; 
            } 
        }
 
        internal override bool IsContainer {
            get { return true;}
        }
 
        //the function is provided only at Load time to speed up Load process
        internal override XmlNode AppendChildForLoad(XmlNode newChild, XmlDocument doc) { 
            XmlNodeChangedEventArgs args = doc.GetInsertEventArgsForLoad( newChild, this ); 

            if (args != null) 
                doc.BeforeEvent( args );

            XmlLinkedNode newNode = (XmlLinkedNode)newChild;
 
            if (lastChild == null
                || lastChild == this) { // if LastNode == null 
                newNode.next = newNode; 
                lastChild = newNode; // LastNode = newNode;
                newNode.SetParentForLoad(this); 
            }
            else {
                XmlLinkedNode refNode = lastChild; // refNode = LastNode;
                newNode.next = refNode.next; 
                refNode.next = newNode;
                lastChild = newNode; // LastNode = newNode; 
                if (refNode.IsText 
                    && newNode.IsText) {
                    NestTextNodes(refNode, newNode); 
                }
                else {
                    newNode.SetParentForLoad(this);
                } 
            }
 
            if (args != null) 
                doc.AfterEvent( args );
 
            return newNode;
        }

        // Gets or sets whether the element does not have any children. 
        public bool IsEmpty {
            get { 
                return lastChild == this; 
            }
 
            set {
                if (value) {
                    if (lastChild != this) {
                        RemoveAllChildren(); 
                        lastChild = this;
                    } 
                } 
                else {
                    if (lastChild == this) { 
                        lastChild = null;
                    }
                }
 
            }
        } 
 
        internal override XmlLinkedNode LastNode {
            get { 
                return lastChild == this ? null : lastChild;
            }

            set { 
                lastChild = value;
            } 
        } 

        internal override bool IsValidChildType( XmlNodeType type ) { 
            switch (type) {
                case XmlNodeType.Element:
                case XmlNodeType.Text:
                case XmlNodeType.EntityReference: 
                case XmlNodeType.Comment:
                case XmlNodeType.Whitespace: 
                case XmlNodeType.SignificantWhitespace: 
                case XmlNodeType.ProcessingInstruction:
                case XmlNodeType.CDATA: 
                    return true;

                default:
                    return false; 
            }
        } 
 

        // Gets a XmlAttributeCollection containing the list of attributes for this node. 
        public override XmlAttributeCollection Attributes {
            get {
                if (attributes == null) {
                    lock ( OwnerDocument.objLock ) { 
                        if ( attributes == null ) {
                            attributes = new XmlAttributeCollection(this); 
                        } 
                    }
                } 

                return attributes;
            }
        } 

        // Gets a value indicating whether the current node 
        // has any attributes. 
        public virtual bool HasAttributes {
            get { 
                if ( this.attributes == null )
                    return false;
                else
                    return this.attributes.Count > 0; 
            }
        } 
 
        // Returns the value for the attribute with the specified name.
        public virtual string GetAttribute(string name) { 
            XmlAttribute attr = GetAttributeNode(name);
            if (attr != null)
                return attr.Value;
            return String.Empty; 
        }
 
        // Sets the value of the attribute 
        // with the specified name.
        public virtual void SetAttribute(string name, string value) { 
            XmlAttribute attr = GetAttributeNode(name);
            if (attr == null) {
                attr = OwnerDocument.CreateAttribute(name);
                attr.Value = value; 
                Attributes.InternalAppendAttribute( attr );
            } 
            else { 
                attr.Value = value;
            } 
        }

        // Removes an attribute by name.
        public virtual void RemoveAttribute(string name) { 
            if (HasAttributes)
                Attributes.RemoveNamedItem(name); 
        } 

        // Returns the XmlAttribute with the specified name. 
        public virtual XmlAttribute GetAttributeNode(string name) {
            if (HasAttributes)
                return Attributes[name];
            return null; 
        }
 
        // Adds the specified XmlAttribute. 
        public virtual XmlAttribute SetAttributeNode(XmlAttribute newAttr) {
            if ( newAttr.OwnerElement != null ) 
                throw new InvalidOperationException( Res.GetString(Res.Xdom_Attr_InUse) );
            return(XmlAttribute) Attributes.SetNamedItem(newAttr);
        }
 
        // Removes the specified XmlAttribute.
        public virtual XmlAttribute RemoveAttributeNode(XmlAttribute oldAttr) { 
            if (HasAttributes) 
                return(XmlAttribute) Attributes.Remove(oldAttr);
            return null; 
        }

        // Returns a XmlNodeList containing
        // a list of all descendant elements that match the specified name. 
        public virtual XmlNodeList GetElementsByTagName(string name) {
            return new XmlElementList( this, name ); 
        } 

        // 
        // DOM Level 2
        //

        // Returns the value for the attribute with the specified LocalName and NamespaceURI. 
        public virtual string GetAttribute(string localName, string namespaceURI) {
            XmlAttribute attr = GetAttributeNode( localName, namespaceURI ); 
            if (attr != null) 
                return attr.Value;
            return String.Empty; 
        }

        // Sets the value of the attribute with the specified name
        // and namespace. 
        public virtual string SetAttribute(string localName, string namespaceURI, string value) {
            XmlAttribute attr = GetAttributeNode( localName, namespaceURI ); 
            if (attr == null) { 
                attr = OwnerDocument.CreateAttribute( string.Empty, localName, namespaceURI );
                attr.Value = value; 
                Attributes.InternalAppendAttribute( attr );
            }
            else {
                attr.Value = value; 
            }
 
            return value; 
        }
 
        // Removes an attribute specified by LocalName and NamespaceURI.
        public virtual void RemoveAttribute(string localName, string namespaceURI) {
            //Debug.Assert(namespaceURI != null);
            RemoveAttributeNode( localName, namespaceURI ); 
        }
 
        // Returns the XmlAttribute with the specified LocalName and NamespaceURI. 
        public virtual XmlAttribute GetAttributeNode(string localName, string namespaceURI) {
            //Debug.Assert(namespaceURI != null); 
            if (HasAttributes)
                return Attributes[ localName, namespaceURI ];
            return null;
        } 

        // Adds the specified XmlAttribute. 
        public virtual XmlAttribute SetAttributeNode(string localName, string namespaceURI) { 
            XmlAttribute attr = GetAttributeNode( localName, namespaceURI );
            if (attr == null) { 
                attr = OwnerDocument.CreateAttribute( string.Empty, localName, namespaceURI );
                Attributes.InternalAppendAttribute( attr );
            }
            return attr; 
        }
 
        // Removes the XmlAttribute specified by LocalName and NamespaceURI. 
        public virtual XmlAttribute RemoveAttributeNode(string localName, string namespaceURI) {
            //Debug.Assert(namespaceURI != null); 
            if (HasAttributes) {
                XmlAttribute attr = GetAttributeNode( localName, namespaceURI );
                Attributes.Remove( attr );
                return attr; 
            }
            return null; 
        } 

        // Returns a XmlNodeList containing 
        // a list of all descendant elements that match the specified name.
        public virtual XmlNodeList GetElementsByTagName(string localName, string namespaceURI) {
            //Debug.Assert(namespaceURI != null);
            return new XmlElementList( this, localName, namespaceURI ); 
        }
 
        // Determines whether the current node has the specified attribute. 
        public virtual bool HasAttribute(string name) {
            return GetAttributeNode(name) != null; 
        }

        // Determines whether the current node has the specified
        // attribute from the specified namespace. 
        public virtual bool HasAttribute(string localName, string namespaceURI) {
            return GetAttributeNode(localName, namespaceURI) != null; 
        } 

        // Saves the current node to the specified XmlWriter. 
        public override void WriteTo(XmlWriter w) {

            w.WriteStartElement( Prefix, LocalName, NamespaceURI );
 
            if ( HasAttributes ) {
                XmlAttributeCollection attrs = Attributes; 
                for (int i = 0; i < attrs.Count; i += 1) { 
                    XmlAttribute attr = attrs[i];
                    attr.WriteTo(w); 
                }
            }

            if (IsEmpty) { 
                w.WriteEndElement();
            } 
            else { 
                WriteContentTo( w );
                w.WriteFullEndElement(); 
            }
        }

        // Saves all the children of the node to the specified XmlWriter. 
        public override void WriteContentTo(XmlWriter w) {
            for (XmlNode node = FirstChild; node != null; node = node.NextSibling) { 
                node.WriteTo(w); 
            }
        } 

        // Removes the attribute node with the specified index from the attribute collection.
        public virtual XmlNode RemoveAttributeAt(int i) {
            if (HasAttributes) 
                return attributes.RemoveAt( i );
            return null; 
        } 

        // Removes all attributes from the element. 
        public virtual void RemoveAllAttributes() {
            if (HasAttributes) {
                attributes.RemoveAll();
            } 
        }
 
        // Removes all the children and/or attributes 
        // of the current node.
        public override void RemoveAll() { 
            //remove all the children
            base.RemoveAll();
            //remove all the attributes
            RemoveAllAttributes(); 
        }
 
        internal void RemoveAllChildren() { 
            base.RemoveAll();
        } 

        public override IXmlSchemaInfo SchemaInfo {
            get {
                return name; 
            }
        } 
 
        // Gets or sets the markup representing just
        // the children of this node. 
        public override string InnerXml {
            get {
                return base.InnerXml;
            } 
            set {
                RemoveAllChildren(); 
                XmlLoader loader = new XmlLoader(); 
                loader.LoadInnerXmlElement( this, value );
            } 
        }

        // Gets or sets the concatenated values of the
        // node and all its children. 
        public override string InnerText {
            get { 
                return base.InnerText; 
            }
            set { 
                XmlLinkedNode linkedNode = LastNode;
                if (linkedNode != null && //there is one child
                    linkedNode.NodeType == XmlNodeType.Text && //which is text node
                    linkedNode.next == linkedNode ) // and it is the only child 
                {
                    //this branch is for perf reason, event fired when TextNode.Value is changed. 
                    linkedNode.Value = value; 
                }
                else { 
                    RemoveAllChildren();
                    AppendChild( OwnerDocument.CreateTextNode( value ) );
                }
            } 
        }
 
        public override XmlNode NextSibling { 
            get {
                if (this.parentNode != null 
                    && this.parentNode.LastNode != this)
                    return next;
                return null;
            } 
        }
 
        internal override void SetParent(XmlNode node) { 
            this.parentNode = node;
        } 

        internal override XPathNodeType XPNodeType { get { return XPathNodeType.Element; } }

        internal override string XPLocalName { get { return LocalName; } } 

        internal override string GetXPAttribute( string localName, string ns ) { 
            if ( ns == OwnerDocument.strReservedXmlns ) 
                return null;
            XmlAttribute attr = GetAttributeNode( localName, ns ); 
            if ( attr != null )
                return attr.Value;
            return string.Empty;
        } 
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.


                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK