我有一个XmlWriter,它包含一个看起来像下面的xml,只是有更多的节点。什么是从这个xml中删除所有ARTIST节点的最快最好的方法?
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
</CD>
<CD>
<TITLE>Hide your heart</TITLE>
<ARTIST>Bonnie Tyler</ARTIST>
</CD>
</CATALOG>
答案 0 :(得分:3)
只要文件不是千兆字节,XmlDocument就可以了:
XmlDocument XDoc = new XmlDocument();
XDoc.Load(MapPath(@"~\xml\test.xml"));
XmlNodeList Nodes = XDoc.GetElementsByTagName("ARTIST");
foreach (XmlNode Node in Nodes)
Node.ParentNode.RemoveChild(Node);
XDoc.Save(MapPath(@"~\xml\test_out.xml"));
答案 1 :(得分:2)
当我尝试Steve的解决方案时,我收到以下错误“元素列表已更改。枚举操作无法继续”。我知道这有点像黑客,但为了解决这个问题,我使用了以下内容:
//Load XML
XmlDocument XDoc = new XmlDocument();
XDoc.Load(MapPath(@"~\xml\test.xml"));
//Get list of offending nodes
XmlNodeList Nodes = XDoc.GetElementsByTagName("ARTIST");
//Loop through the list
while (Nodes.Count != 0) {
foreach (XmlNode Node in Nodes) {
//Remove the offending node
Node.ParentNode.RemoveChild(Node); //<--This line messes with our iteration and forces us to get a new list after each remove
//Stop the loop
break;
}
//Get a refreshed list of offending nodes
Nodes = XDoc.GetElementsByTagName("ARTIST");
}
//Save the document
XDoc.Save(newfile);
我陷入困境,急需一些事情,这就完成了工作。
答案 2 :(得分:0)
从你的问题措辞的方式来看,我假设你有一个XmlWriter用于编写一个XmlDocument,你想在调用flush
之前操纵它要写的内容。
我担心你想要做的事情可能是不可能的。 XmlWriter并不意味着在将XML写入目标流之前对其进行操作。