我有一個問題涉及從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);
我能夠找到節點與期望的屬性的文檔,刪除或佔位符,但我不是能夠將此節點的子節點向上移動一級。在這種情況下你能幫助我嗎?它可以與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更新你的問題嗎? – 2013-02-19 21:26:49
我已經更新了我的簡化的xml文件。感謝提示,現在更容易爲其他人閱讀。 – wariacik 2013-02-19 23:04:35