2012-12-05 2 views
10

Ho un documento XML che assomiglia a questo:Come rimuovere un elemento da un XML utilizzando XDocument quando abbiamo più elementi con lo stesso nome ma diversi attributi

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

Tutti gli elementi hanno lo stesso nome di elemento, ma diverso attributi. Come rimuovo un particolare elemento e gli attributi da questo xml utilizzando XDocument in C#?

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

Il comando precedente non funziona come tutti gli elementi hanno lo stesso nome.

C'è un modo per identificare un elemento con, diverso dal suo nome? E se sì, come posso usarlo per rimuoverlo da XDocument?

+0

Hai eseguito il debug del codice? Sai che cosa sta restituendo .Element ("myApp")? Sto solo cercando un po 'più di informazioni su quello che stai vedendo. – Jr0

+0

Grazie per il suggerimento. Capisco .Element ("myApp") restituisce il primo elemento con il nome "myApp", corretto? –

risposta

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

AGGIORNAMENTO È quasi fatto il lavoro. Quello che ti sei perso è filtrare gli elementi in base al valore dell'attributo. Ecco il codice con il filtraggio e la rimozione di elementi selezionati:

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

Se si dispone di tag diversi myApp sotto Applications contenente add, si può preferire una versione più sicura

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

È può anche utilizzare XPath (System.Xml.XPath)

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

Grazie per la risposta. Il mio xml ha in effetti altri tag contenenti "aggiungi". –