Проверка содержимого существующего XML-элемента и его замена

У меня есть приложение aС#, которое записывает в XML, используя следующий код:

//Write last compliant elements to state XML if allCompliant bool == true
 if (allCompliant == true)
 {
 if (File.Exists(MainEntry.thirdPartyStateXMLPath))
 {
 XDocument doc = XDocument.Load(MainEntry.thirdPartyStateXMLPath);

 DateTime localCurrentTime = DateTime.Now;
 DateTime utcCurrentTime = DateTime.UtcNow;

 XElement root = new XElement("Compliance_Status");

 root.Add(new XElement("Last_Known_Compliant_UTC", utcCurrentTime));
 root.Add(new XElement("Last_Known_Compliant_LocalTime", localCurrentTime.ToString()));
 doc.Element("Compliance_Items").Add(root);
 doc.Save(MainEntry.thirdPartyStateXMLPath);

 }

 }

Это отображает следующий XML:

<!--?xml version="1.0" encoding="utf-8"?-->
<compliance_items>
 <compliance_status>
 <last_known_compliant_utc>2014-04-03T23:22:31.507088Z</last_known_compliant_utc>
 <last_known_compliant_localtime>4/3/2014 4:22:31 PM</last_known_compliant_localtime>
 </compliance_status>
</compliance_items>

Этот код генерирует элементы и значения * Last_Known_Compliant_UTC * и * Last_Known_Compliant_LocalTime *. При последующих запусках кода я хочу, чтобы он заменял только значения существующих элементов, но, как написано, каждый раз каждый раз воссоздается и сохраняется в XML:

<compliance_status>
 <last_known_compliant_utc>2014-04-03T23:22:31.507088Z</last_known_compliant_utc>
 <last_known_compliant_localtime>4/3/2014 4:22:31 PM</last_known_compliant_localtime>
</compliance_status>

Как я могу достичь желаемого эффекта?

1 ответ

Если вы хотите получить конкретный элемент и изменить его, вы можете сделать следующее:

var xmlDocument = XDocument.Load("path");

var element = xmlDocument
.Descendants("Compliance_Status")
.FirstOrDefault(x => (DateTime)x.Element("Last_Known_Compliant_UTC") == someValue)

if(element != null) 
 /* update the value simply using element.Value = something 
 and save the xml file xmlDocument.Save("path") */

Если вы хотите заменить элемент другим элементом, вы можете использовать метод XElement.ReplaceWith.

licensed under cc by-sa 3.0 with attribution.