Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / untmp / whidbey / QFE / ndp / fx / src / Xml / System / Xml / Dom / XmlElement.cs / 3 / 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)); if ( name.Prefix.Length >= 3 && (! doc.IsLoading) && String.Compare( name.Prefix, 0, "xml", 0, 3, StringComparison.OrdinalIgnoreCase ) == 0 ) throw new ArgumentException(Res.GetString(Res.Xdom_Ele_Prefix)); 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. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- TypeCollectionDesigner.xaml.cs
- MembershipSection.cs
- FindCriteriaElement.cs
- PersonalizationProviderCollection.cs
- TypeSystem.cs
- securitymgrsite.cs
- RouteCollection.cs
- SecondaryViewProvider.cs
- PeerNameResolver.cs
- ElapsedEventArgs.cs
- UInt16Converter.cs
- ToolStripTemplateNode.cs
- ReachDocumentReferenceCollectionSerializer.cs
- ToolBarPanel.cs
- EmptyStringExpandableObjectConverter.cs
- SrgsNameValueTag.cs
- ChildrenQuery.cs
- ListViewHitTestInfo.cs
- SqlDataSource.cs
- ServiceModelSecurityTokenRequirement.cs
- SqlDataSource.cs
- wgx_commands.cs
- Attributes.cs
- ContextMenu.cs
- WebMethodAttribute.cs
- MarkupCompilePass1.cs
- ConfigurationErrorsException.cs
- IfJoinedCondition.cs
- BaseResourcesBuildProvider.cs
- HostingEnvironmentSection.cs
- BrowserCapabilitiesCodeGenerator.cs
- HtmlForm.cs
- WebPartZoneCollection.cs
- ObjectPersistData.cs
- ZipIORawDataFileBlock.cs
- DockPattern.cs
- BuildProvidersCompiler.cs
- Ray3DHitTestResult.cs
- WebPartUtil.cs
- TextureBrush.cs
- SelectorItemAutomationPeer.cs
- HttpAsyncResult.cs
- TreeViewHitTestInfo.cs
- RangeContentEnumerator.cs
- TargetPerspective.cs
- NameSpaceExtractor.cs
- TypeDelegator.cs
- IdentityNotMappedException.cs
- OleDbConnectionPoolGroupProviderInfo.cs
- Button.cs
- QueryExpr.cs
- ToolStripItemImageRenderEventArgs.cs
- NodeCounter.cs
- ThreadInterruptedException.cs
- Compiler.cs
- WmlValidationSummaryAdapter.cs
- SqlAliasesReferenced.cs
- AutoSizeComboBox.cs
- SemanticTag.cs
- TypeElementCollection.cs
- FtpWebRequest.cs
- FormViewModeEventArgs.cs
- PriorityBindingExpression.cs
- BindingList.cs
- FormsAuthenticationModule.cs
- ResourceProperty.cs
- CountAggregationOperator.cs
- CfgSemanticTag.cs
- WebSysDisplayNameAttribute.cs
- HelpInfo.cs
- PeerToPeerException.cs
- XPathParser.cs
- ListMarkerLine.cs
- SqlPersistenceProviderFactory.cs
- GradientBrush.cs
- TableLayoutSettingsTypeConverter.cs
- AutomationPropertyInfo.cs
- PrintDialogException.cs
- DependencySource.cs
- LocalFileSettingsProvider.cs
- SmiEventStream.cs
- XPathNavigatorReader.cs
- BasicExpandProvider.cs
- TargetControlTypeCache.cs
- SHA1.cs
- ClientSettings.cs
- PerspectiveCamera.cs
- CustomPopupPlacement.cs
- CurrencyManager.cs
- Parsers.cs
- FileRecordSequenceHelper.cs
- EncodingNLS.cs
- MonitoringDescriptionAttribute.cs
- WebPartConnectionsConfigureVerb.cs
- XhtmlBasicValidationSummaryAdapter.cs
- XamlNamespaceHelper.cs
- OleDbRowUpdatedEvent.cs
- TextServicesContext.cs
- DateTimeFormatInfo.cs
- SqlDataSourceFilteringEventArgs.cs