2013-07-24 46 views
0

*編輯:好了,所以我要刪除的程序,行foreach (var elem in doc.Document.Descendants("Profiles"))所需的「個人資料」來代替。但現在在我的XML文檔沒有爲每一個刪除一個空的簡檔元素,所以如果在XML實例中的所有項目(在問題的底部)被刪除我留下了這一點:*刪除從XML文檔中的元素,並節省了舊文件

<?xml version="1.0" encoding="utf-8"?> 
<Profiles> 
    <Profile /> 
    <Profile /> 
</Profiles> 

=========================原來的問題BELOW ==================== =============

我用下面的代碼刪除一個元素,它是從XML文件中的孩子,但它不是從文件在保存刪除它們。有人能告訴我爲什麼這是不正確的嗎?

public void DeleteProfile() 
    { 
     var doc = XDocument.Load(ProfileFile); 
     foreach (var elem in doc.Document.Descendants("Profiles")) 
     { 
      foreach (var attr in elem.Attributes("Name")) 
      { 
       if (attr.Value.Equals(this.Name)) 
        elem.RemoveAll(); 
      } 
     } 
     doc.Save(ProfileFile, 
     MessageBox.Show("Deleted Successfully"); 
    } 

編輯:XML格式的下面

<?xml version="1.0" encoding="utf-8"?> 
<Profiles> 
    <Profile Name="MyTool"> 
    <ToolName>PC00121</ToolName> 
    <SaveLocation>C:\Users\13\Desktop\TestFolder1</SaveLocation> 
    <Collections>True.True.True</Collections> 
    </Profile> 
    <Profile Name="TestProfile"> 
    <ToolName>PC10222</ToolName> 
    <SaveLocation>C:\Users\14\Desktop\TestFolder2</SaveLocation> 
    <Collections>True.False.False</Collections> 
    </Profile> 
</Profiles> 
+0

您是否嘗試過這個調試,使確定首先刪除了元素?也許沒有任何東西被刪除,你只是再次保存相同的確切文件? – Lochemage

+0

這是八九不離十了什麼,我認爲是/正在發生的事情,我只是不與XML非常熟悉,知道如果我甚至做了適當地刪除。我會再次調試,看看我可以推導出什麼,但是我也會拋出一個來自問題中xml的例子,以及在這裏向社區明確什麼是錯誤的情況。 – DarthSheldon

回答

3

一個例子,我假設你想刪除的個人資料給它的名字:

private static void RemoveProfile(string profileFile, string profileName) 
{ 
    XDocument xDocument = XDocument.Load(profileFile); 
    foreach (var profileElement in xDocument.Descendants("Profile") // Iterates through the collection of "Profile" elements 
              .ToList())    // Copies the list (it's needed because we modify it in the foreach (when the element is removed) 
    { 
     if (profileElement.Attribute("Name").Value == profileName) // Checks the name of the profile 
     { 
      profileElement.Remove();         // Removes the element 
     } 
    } 
    xDocument.Save(profileFile); 
} 

如果你只有一個空的元素因爲你用RemoveAll()(刪除後裔和元素的屬性),而不是Remove()(去除它的父元素它的自我)。

你甚至可以通過在LINQ查詢由where替換它刪除if

foreach (var profileElement in (from profileElement in xDocument.Descendants("Profile")  // Iterates through the collection of "Profile" elements 
           where profileElement.Attribute("Name").Value == profileName // Checks the name of the profile 
           select profileElement).ToList())        // Copies the list (it's needed because we modify it in the foreach (when the element is removed) 
    profileElement.Remove(); // Removes the element 

xDocument.Save(profileFile); 
+0

我解決了這個問題,但你的答案稍微更清潔,更優雅,所以我會繼續選擇這個 – DarthSheldon

0
.... 
foreach (var elem in doc.Document.Descendants("Profiles")) 
{ 
    foreach (var attr in elem.Attributes("Name")) 
    { 
      if (attr.Value.Equals(this.Name)) 
       TempElem = elem; 
    } 
} 
TempElem.Remove(); 
... 

我啞笑,這個解決一切問題