我有一个问题涉及从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