Questo è pensato per essere un miglioramento rispetto alla risposta accettato di gestire gli attributi:
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();
L'idea è di verificare che tutti gli attributi su un elemento siano vuoti anche prima di rimuoverlo. C'è anche il caso in cui i discendenti vuoti possono avere attributi non vuoti.Ho inserito una terza condizione per verificare che l'elemento abbia tutti gli attributi vuoti tra i suoi discendenti. Considerando il seguente documento con node8 aggiunto:
<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>
Questo sarebbe diventato:
<root>
<node2 blah="" adf="2"></node2>
<node5><![CDATA[asdfasdf]]></node5>
<node6 xmlns="urn://blah" d="a" />
<node8>
<child2 d='a' />
</node8>
</root>
L'originale e migliorato risposta a questa domanda sarebbe perdere i nodi node2
e node6
e node8
. Il controllo di e.IsEmpty
funzionerebbe se si desidera eliminare solo nodi come <node />
, ma è ridondante se si sta utilizzando sia <node />
e <node></node>
. Se anche è necessario rimuovere gli attributi vuoti, si potrebbe fare questo:
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();
che darebbe:
<root>
<node2 adf="2"></node2>
<node5><![CDATA[asdfasdf]]></node5>
<node6 xmlns="urn://blah" d="a" />
</root>
fonte
2015-06-16 22:31:22
Argh! non regex! – JXG
Ieri ho fatto un semplice test di perfermance, l'XDocument è di gran lunga migliore rispetto alla reisex in termini di peformance, non ho ancora capito come implementarlo usando XmlTextReader, in termini di complessità, XDocument è abbastanza buono per rispondere alle mie esigenze, quindi Vado su XDocument, grazie a tutti i tuoi aiuti! – Ming
questo potrebbe aiutare http://stackoverflow.com/questions/14509188/remove-empty-blanks-elements-in-collection-of-xml-nodes –