从XML文件中删除所有Artist节点

时间:2011-04-06 12:21:09

标签: c# .net xml

我有一个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> 

3 个答案:

答案 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写入目标流之前对其进行操作。