xmlファイルから特定のノードを削除することに関連する質問があります。
これが私の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>
このノードの子を削除せずにノードを削除したいと思いnodeB="toRemove"
ます。その後、私はと同じことをする必要がありますnodeB attribute="placeHolder"
。結果の一部は次のようになります。
<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>
私はそれを達成するためにこのようなコードを試してきました:
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);
目的の属性toRemoveまたはplaceHolderを持つノードを見つけることはできますが、このノードの子を1レベル上に移動することはできません。この場合、私を助けてくれませんか。Linq、XDocument、XmlReaderを使用することで解決できますが、私はXmlDocumentを使用することを好みます。事前にご協力いただきありがとうございます。
編集:
この場合、Chuck Savageが以下に書いた(順序を維持するために)わずかに変更されたコードを使用しました。一度削除する
<nodeB attribute="toRemove"> </nodeB>
そして、同じことをします
<nodeB attribute="placeHolder"></nodeB>
これが少し変更されたコードです
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);
この場合、@MiMoによって提供されるxsltアプローチも非常に役立ちます。