2012-12-05 15 views
10

Mam dokumentu XML, który wygląda tak:Jak usunąć element z XML przy użyciu XDocument gdy mamy wiele elementów o tej samej nazwie, ale różne atrybuty

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

Wszystkie elementy mają taką samą nazwę elementu, ale inna atrybuty. Jak usunąć jeden konkretny element i jego atrybuty z tego xml za pomocą XDocument w C#?

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

Powyższe polecenie nie działa, ponieważ wszystkie elementy mają taką samą nazwę.

Czy istnieje sposób identyfikacji elementu za pomocą innego niż nazwa? A jeśli tak, jak mogę tego użyć, aby usunąć go z XDocument?

+0

Czy debugowałeś kod? Czy wiesz, co powraca .Element ("myApp")? Po prostu szukam trochę więcej informacji o tym, co dokładnie się dzieje. – Jr0

+0

Dzięki za sugestię. Rozumiem .Element ("myApp") zwraca pierwszy element z nazwą "myApp", zgadza się? –

Odpowiedz

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

UPDATE Prawie spełnił swoje zadanie. Brakuje filtrowania elementów według wartości atrybutu. Oto kod z filtrowaniem i usuwanie wybranych elementów:

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(); 

Jeśli masz tagi inne niż myApp pod Applications zawierającej add może wolisz bezpieczniejszą wersję

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

Ty można również użyć XPath (System.Xml.XPath)

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

Dzięki za odpowiedź. Mój xml rzeczywiście ma inne znaczniki zawierające "dodaj". –

Powiązane problemy