Ich habe eine Frage zum Entfernen bestimmter Knoten aus der XML-Datei.Elterknoten ohne childs-Knoten entfernen
Hier ist meine Probe von 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>
Ich mag würde Knoten entfernen nodeB="toRemove"
ohne Kinder dieses Knotens zu entfernen. Danach muss ich dasselbe mit nodeB attribute="placeHolder"
machen. Ein Teil Ergebnis würde so aussehen:
<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>
Ich habe wie dieser Code versucht, das achive:
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);
Ich bin in der Lage Knoten mit dem gewünschten Attribut toremove oder Platzhalter zu finden, aber ich bin nicht in der Lage, Kinder dieser Knoten um eine Ebene nach oben zu verschieben. Könnten Sie mir in diesem Fall helfen? Es kann eine Lösung mit Linq, XDocument, XmlReader sein, aber ich bevorzuge die Arbeit mit XmlDocument. Vielen Dank für jede Hilfe, die Sie mir im Voraus geben könnten.
EDIT:
In diesem Fall habe ich etwas modifizierten Code verwendet wird (um zu erhalten), die Chuck Savage unten geschrieben. Sobald
<nodeB attribute="toRemove"> </nodeB>
zu entfernen und dann das Gleiche tun mit
<nodeB attribute="placeHolder"></nodeB>
Hier etwas Code geändert wird
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);
Xslt Ansatz von @MiMo vorgesehen ist sehr nützlich, wie auch in diesem Fall.
Viele Ihrer 'nodeC' Elemente fehlen ihre schließenden Tags. Können Sie Ihre Frage mit einer gültigen, wohlgeformten XML-Datei aktualisieren? –
Ich habe meine vereinfachte XML-Datei aktualisiert. Danke für den Hinweis, es ist jetzt einfacher für andere zu lesen. – wariacik