0

*編集: OK、削除するプログラムを取得しました。その行に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>
4

2 に答える 2

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 クエリでifa に置き換えることで、を削除することもできます。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);
于 2013-07-24T17:51:36.603 に答える
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();
...

私はばかです笑、これですべてが解決します

于 2013-07-24T18:01:24.307 に答える