从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>
我假设您想要删除一个名为的配置文件
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();
...
我很笨哈哈,这解决了所有