Ho una domanda relativa alla rimozione di nodi specifici dal file xml.rimuovere il nodo genitore senza nodi childs
Ecco il mio esempio di XML:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<nodeA attribute="1">
<nodeB attribute="table">
<nodeC attribute="500"></nodeC>
<nodeC attribute="5"></nodeC>
</nodeB>
<nodeB attribute="3">
<nodeC attribute="4"></nodeC>
<nodeC attribute="5"></nodeC>
<nodeC attribute="5"></nodeC>
</nodeB>
<nodeB attribute="placeHolder">
<nodeB attribute="toRemove">
<nodeB attribute="glass"></nodeB>
<nodeE attribute="7"></nodeE>
<nodeB attribute="glass"></nodeB>
<nodeB attribute="glass"></nodeB>
</nodeB>
</nodeB>
<nodeB attribute="3">
<nodeC attribute="4"></nodeC>
<nodeC attribute="5"></nodeC>
<nodeC attribtue="5"></nodeC>
</nodeB>
<nodeB attribute="placeHolder">
<nodeB attribute="toRemove">
<nodeB attribute="glass"></nodeB>
<nodeE attribute="7"></nodeE>
<nodeB attribute="glass"></nodeB>
<nodeB attribute="glass"></nodeB>
</nodeB>
</nodeB>
</nodeA>
</root>
Vorrei rimuovere nodo nodeB="toRemove"
senza rimuovere i bambini di questo nodo. Dopo di che ho bisogno di fare la stessa cosa con nodeB attribute="placeHolder"
. Parte del risultato ottenuto è come quello:
<nodeB attribute="3">
<nodeC attribute="4"></nodeC>
<nodeC attribute="5"></nodeC>
<nodeC attribtue="5"></nodeC>
</nodeB>
<nodeB attribute="glass"></nodeB>
<nodeE attribute="7"></nodeE>
<nodeB attribute="glass"></nodeB>
<nodeB attribute="glass"></nodeB>
Ho cercato il codice come questo per achive che:
XmlNodeList nodeList = doc.SelectNodes("//nodeB[@attribute=\"toRemove\"]");
foreach (XmlNode node in nodeList)
{
foreach (XmlNode child in node.ChildNodes)
{
node.ParentNode.AppendChild(child);
}
node.ParentNode.RemoveChild(node);
}
doc.Save(XmlFilePathSource);
sono in grado di localizzare nodo con attributo desiderato toremove o un segnaposto, comunque io non sono in grado di spostare i figli di questi nodi di un livello. Potresti aiutarmi in questo caso? Può essere una soluzione con Linq, XDocument, XmlReader ma preferisco lavorare con XmlDocument. Grazie per l'aiuto che potresti fornirmi in anticipo.
EDIT:
In questo caso ho usato il codice leggermente modificato (per preservare l'ordine) che Chuck Savage ha scritto sotto. Una volta per rimuovere
<nodeB attribute="toRemove"> </nodeB>
e poi fare lo stesso con
<nodeB attribute="placeHolder"></nodeB>
Qui è leggermente modificata codice
XElement root = XElement.Load(XmlFilePathSource);
var removes = root.XPathSelectElements("//nodeB[@attribute=\"toRemove\"]");
foreach (XElement node in removes.ToArray())
{
node.Parent.AddAfterSelf(node.Elements());
node.Remove();
}
root.Save(XmlFilePathSource);
approccio XSLT fornito da @MiMo è molto utile anche in questo caso.
Molti degli elementi 'nodeC' mancano i loro tag di chiusura. Puoi aggiornare la tua domanda con xml valido e ben formato? –
Ho aggiornato il mio file XML semplificato. Grazie per il suggerimento, è più facile da leggere per gli altri ora. – wariacik