Mam pytanie dotyczące usuwania określonych węzłów z pliku xml.usuń węzeł nadrzędny bez węzłów potomnych
Oto moja próbka 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>
Chciałbym usunąć bez usuwania węzła nodeB="toRemove"
Dziecięce tego węzła. Potem muszę zrobić to samo z nodeB attribute="placeHolder"
. Część wyniku będzie wyglądać tak:
<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>
staram kod tak, aby achive że:
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);
jestem w stanie zlokalizować węzeł z pożądaną cechą toRemove lub symbol zastępczy, jednak nie jestem w stanie przenieść dzieci z tych węzłów o jeden poziom. Czy możesz mi pomóc w tej sprawie? Może to być rozwiązanie z Linq, XDocument, XmlReader, ale wolę pracować z XmlDocument. Dziękuję za wszelką pomoc, jaką możesz mi zapewnić z góry.
EDIT:
W tym przypadku użyłem kodu nieznacznie zmodyfikowany (aby zachować porządek), że Chuck Savage napisał poniżej. Raz, aby usunąć
<nodeB attribute="toRemove"> </nodeB>
a następnie zrób to samo z
<nodeB attribute="placeHolder"></nodeB>
Oto nieco zmodyfikowany kod
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);
podejście XSLT dostarczone przez @MiMo jest bardzo przydatna również w tym przypadku.
Wiele elementów 'nodeC' nie ma znaczników zamykających. Czy możesz zaktualizować swoje pytanie za pomocą prawidłowego, dobrze sformułowanego xml? –
Zaktualizowałem mój uproszczony plik xml. Dzięki za podpowiedź, teraz łatwiej jest czytać innym. – wariacik