nodo leer especifico eliminar atributos agregar .net xmldocument xmldom

.net - leer - ¿Cómo eliminar todos los nodos secundarios de un XmlElement, pero mantener todos los atributos?



leer atributos xml c# (3)

¿No sería esta solución más sencilla?

while(e.FirstChild != null) e.RemoveChild(e.FirstChild);

¿Cómo eliminar todos los nodos secundarios de un XmlElement , pero mantener todos los atributos?

Tenga en cuenta que XmlElement.RemoveAll también elimina todos los atributos. ¿Qué es una forma limpia, elegante y de buen rendimiento para eliminar todos los nodos secundarios? En otras palabras, ¿cuál es la mejor práctica aquí?


Para una solución verdaderamente eficiente:

e.IsEmpty = true;

Es tu opción más rápida y sencilla. Hace exactamente lo que solicitó: todo el texto interno y los elementos anidados se descartan, mientras que los atributos se conservan.


Opción 1 Use elem.InnerXml = ""; El código de trabajo completo si necesita esto:

var doc = new XmlDocument(); doc.LoadXml("<x a1=''a'' a2=''b''><child1/><child2/></x>"); var elem = doc.DocumentElement; Console.WriteLine(elem.OuterXml); Console.WriteLine("HasAttributes " + elem.HasAttributes); Console.WriteLine("HasChildNodes " + elem.HasChildNodes); elem.InnerXml = ""; Console.WriteLine(elem.OuterXml); Console.WriteLine("HasAttributes " + elem.HasAttributes); Console.WriteLine("HasChildNodes " + elem.HasChildNodes); Console.ReadLine();

Información detallada de lo que hace InnerXml:

public override string InnerXml { get { return base.InnerXml; } set { this.RemoveAllChildren(); new XmlLoader().LoadInnerXmlElement(this, value); } }

Podría haber un problema de rendimiento en LoadInnerXmlElement, pero como tenemos una cadena vacía, no debería ser grande, porque la mayoría del tiempo tomará este método:

internal XmlNamespaceManager ParsePartialContent(XmlNode parentNode, string innerxmltext, XmlNodeType nt) { this.doc = parentNode.OwnerDocument; XmlParserContext context = this.GetContext(parentNode); this.reader = this.CreateInnerXmlReader(innerxmltext, nt, context, this.doc); try { this.preserveWhitespace = true; bool isLoading = this.doc.IsLoading; this.doc.IsLoading = true; if (nt == XmlNodeType.Entity) { XmlNode newChild; while (this.reader.Read() && (newChild = this.LoadNodeDirect()) != null) parentNode.AppendChildForLoad(newChild, this.doc); } else { XmlNode newChild; while (this.reader.Read() && (newChild = this.LoadNode(true)) != null) parentNode.AppendChildForLoad(newChild, this.doc); } this.doc.IsLoading = isLoading; } finally { this.reader.Close(); } return context.NamespaceManager; }

Opción 2 Código siguiente:

XmlNode todelete = elem.FirstChild; while (todelete != null) { elem.RemoveChild(elem.FirstChild); todelete = elem.FirstChild; }

Acerca de performane. Echemos un vistazo a XmlElement.RemoveAll () es:

public override void RemoveAll() { base.RemoveAll(); this.RemoveAllAttributes(); }

Donde base.RemoveAll () es exactamente:

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] public virtual void RemoveAll() { XmlNode oldChild = this.FirstChild; for (; oldChild != null; { XmlNode nextSibling; oldChild = nextSibling; } ) { nextSibling = oldChild.NextSibling; this.RemoveChild(oldChild); } }

Así es como escribí arriba