Esto está destinado a ser una mejora en la respuesta aceptada para manejar atributos:
XDocument xd = XDocument.Parse(original);
xd.Descendants()
.Where(e => (e.Attributes().All(a => a.IsNamespaceDeclaration || string.IsNullOrWhiteSpace(a.Value))
&& string.IsNullOrWhiteSpace(e.Value)
&& e.Descendants().SelectMany(c => c.Attributes()).All(ca => ca.IsNamespaceDeclaration || string.IsNullOrWhiteSpace(ca.Value))))
.Remove();
La idea aquí es verificar que todos los atributos en un elemento también estén vacíos antes de eliminarlo. También existe el caso de que los descendientes vacíos pueden tener atributos no vacíos.Inserté una tercera condición para verificar que el elemento tenga todos los atributos vacíos entre sus descendientes. Teniendo en cuenta el siguiente documento con node8 añade:
<root>
<node />
<node2 blah='' adf='2'></node2>
<node3>
<child />
</node3>
<node4></node4>
<node5><![CDATA[asdfasdf]]></node5>
<node6 xmlns='urn://blah' d='a'/>
<node7 xmlns='urn://blah2' />
<node8>
<child2 d='a' />
</node8>
</root>
Esto se convertiría en:
<root>
<node2 blah="" adf="2"></node2>
<node5><![CDATA[asdfasdf]]></node5>
<node6 xmlns="urn://blah" d="a" />
<node8>
<child2 d='a' />
</node8>
</root>
El original y mejorado respuesta a esta pregunta perdería los node2
y node6
y node8
nodos. La comprobación de e.IsEmpty
funcionaría si solo desea eliminar nodos como <node />
, pero es redundante si va a <node />
y <node></node>
. Si también necesita quitar atributos vacíos, usted puede hacer esto:
xd.Descendants().Attributes().Where(a => string.IsNullOrWhiteSpace(a.Value)).Remove();
xd.Descendants()
.Where(e => (e.Attributes().All(a => a.IsNamespaceDeclaration))
&& string.IsNullOrWhiteSpace(e.Value))
.Remove();
que le daría:
<root>
<node2 adf="2"></node2>
<node5><![CDATA[asdfasdf]]></node5>
<node6 xmlns="urn://blah" d="a" />
</root>
Argh! no regex! – JXG
Hice una prueba de perfermancia simple ayer, el XDocument es mucho mejor que la expresión regular en términos de rendimiento, todavía no he descubierto cómo implementarlo usando XmlTextReader, en términos de complejidad, XDocument es lo suficientemente bueno para hacer frente a mis necesidades, por lo voy por XDocument, ¡gracias a todos por tu ayuda! – Ming
esto podría ayudar http://stackoverflow.com/questions/14509188/remove-empty-blanks-elements-in-collection-of-xml-nodes –