我是一名有用的助手,我可以为您翻译文本。
我希望删除节点
我一直在尝试编写类似这样的代码来实现这个目标:
我能够找到具有所需属性toRemove或placeHolder的节点,但我无法将这些节点的子元素上移一级。你能帮我解决这个问题吗?可以使用Linq、XDocument、XmlReader等方法来解决,但我更喜欢使用XmlDocument。
非常感谢您提前提供的任何帮助。
编辑:
在这种情况下,我使用了稍作修改的代码(为了保持顺序),Chuck Savage在下面写的代码。一旦删除。
@MiMo 提供的 XSLT 方法在这种情况下非常有用。
我有一个与从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的节点,但我无法将这些节点的子元素上移一级。你能帮我解决这个问题吗?可以使用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 方法在这种情况下非常有用。
nodeC
元素缺少闭合标签。你能否更新你的问题,使用有效的、格式良好的 XML? - Ryan Gates