*编辑:好的,所以我让程序删除,而foreach (var elem in doc.Document.Descendants("Profiles"))
行需要“个人资料”。但是现在在我的XML文档中,每个删除的文件都有一个空的配置文件元素,所以如果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");
}
编辑:以下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 :(得分: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查询中的if
替换它来删除where
:
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);
答案 1 :(得分: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();
...
我很笨,这解决了一切