从XML文档中删除元素并保存在旧文件上

本文关键字:存在 保存 文件 元素 XML 文档 删除 | 更新日期: 2023-09-27 18:24:40

*编辑:好的,所以我删除了程序,foreach (var elem in doc.Document.Descendants("Profiles"))行需要"Profile"。但现在在我的XML文档中,每个删除的项目都有一个空的Profile元素,所以如果XML示例(问题底部)中的所有项目都被删除了,我只剩下:*

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

=========================下面的原始问题==========================

我使用以下代码从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");
    }

EDIT:下面的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>

从XML文档中删除元素并保存在旧文件上

我假设您想要删除一个名为的配置文件

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);
....
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();
...

我很笨哈哈,这解决了所有