web-dev-qa-db-ja.com

同じ名前で属性が異なる複数の要素がある場合に、Xdocumentを使用してxmlから要素を削除する方法

私は次のようなxmlドキュメントを持っています:

<Applications>
  <myApp>
    <add key="ErrorDestinationEventLog" value="EventLog" />
    <add key="version" value="5.0.0.0" />
    <add key="DebugMode_RUN" value="true" />
  </myApp>
</Applications>

すべての要素の要素名は同じですが、属性が異なります。 C#でXDocumentを使用して、このxmlから特定の要素とその属性を削除するにはどうすればよいですか?

xd.Element("Applications").Element("myApp").Element(xe.Name).RemoveAll();

すべての要素が同じ名前であるため、上記のコマンドは機能しません。

名前以外に要素を識別する方法はありますか?もしそうなら、どうすればこれを使用してXDocumentから削除できますか?

13
naren.katneni
string key = "version";
XDocument xdoc = XDocument.Load(path_to_xml);
xdoc.Descendants("add")
    .Where(x => (string)x.Attribute("key") == key)
    .Remove();

[〜#〜] update [〜#〜]あなたはほとんど仕事をしました。見逃したのは、属性値で要素をフィルタリングすることです。選択した要素をフィルタリングして削除するコードは次のとおりです。

xd.Element("Applications")
  .Element("myApp")
  .Elements("add")
  .Where(x => (string)x.Attribute("key") == key)
  .Remove();
24
xd.Descendants("add")
    .First(a => a.Attribute("key").Value == "version")
    .Remove();

myAppの下にApplications以外のタグがあり、addが含まれている場合は、より安全なバージョンをお勧めします。

xd.Descendants("myApp").First()
    .Descendants("add")
    .Where(x => (string)x.Attribute("key") == "version")
    .Remove();

XPath(System.Xml.XPath)を使用することもできます

string key="version";
xd.XPathSelectElement(String.Format("//myApp/add[@key='{0}']",key)).Remove();
3
L.B