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>
私はそれを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);
私は必要な属性toRemoveまたはプレースホルダを持つノードを見つけることができています、しかし、私はないですこのノードの子を1レベル上に移動することができます。この場合、私を助けてくれますか?それはLinq、XDocument、XmlReaderで解決できますが、私はXmlDocumentで作業することを好む。 事前にご連絡いただきありがとうございました。
編集:私はチャックサベージがベローズを書いた(順序を維持するために)わずかに修正されたコードを使用している。この場合
。一度
<nodeB attribute="toRemove"> </nodeB>
を除去した後、ここ
<nodeB attribute="placeHolder"></nodeB>
と同じことを行うために@MiMoによって提供わずかに修正されたコード
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アプローチは、この場合も同様に非常に有用です。
あなたの 'nodeC'要素の多くに、終了タグがありません。正当な整形式のXMLで質問を更新できますか? –
私は単純化されたXMLファイルを更新しました。ヒントをありがとう、それは他の人のために今読むのが簡単です。答えのために – wariacik