2011-04-06 47 views
3

我有一個XmlWriter,它包含一個xml,它看起來像下面這個,只是有更多的節點。從這個xml中刪除所有ARTIST節點的最快和最好的方法是什麼?從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

你需要使用XmlWriter還是可以使用XmlDocument或XDocument? – 2011-04-06 12:22:22

+0

我需要使用XmlWriter。如果有一種快速的方法將其翻轉到XmlDucument並翻轉,也許它已經足夠了。 – Erez 2011-04-06 12:26:08

+0

XmlWriter不能'包含'XML - 它不能讀取或存儲它。你如何閱讀或存儲XML?順便說一下,我建議使用XSLT - 使用默認模板輸出除藝術家之外的所有內容。我建議的唯一原因是因爲這就是XSLT的用途 - 轉換XML文件。 – 2011-04-06 12:50:26

回答

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")); 
0

從你的問題的措辭方式,我假設你有一個已被用來寫一個XmlDocument的XmlWriter的,你想操縱它會寫flush被調用之前。

恐怕你想做的事情可能是不可能的。 XmlWriter並不意味着在將XML寫入目標流之前對其進行操作。

+0

我不介意將它加載到xmldoucment並在操作後保存它爲bacl – Erez 2011-04-06 13:07:22

2

當我試圖史蒂夫的解決方案,我收到以下錯誤「的元素列表已經改變枚舉操作無法繼續 」。我知道這是一個黑客位,但要解決這個問題我用下面的:

//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); 

我在困境和需要的東西快速,這讓工作做好。