基于相邻子元素值选择性更新XML子元素值

时间:2014-02-27 08:29:07

标签: c# xml xml-serialization

我有一个.XML文件,如下所示:

<Compliance_Items>
  <Compliance_Item>
    <Application_Name>Notepad++</Application_Name>
    <Installed_Version>6.5.3</Installed_Version>
    <Required_Version>6.5.4</Required_Version>
    <Detected_Missing_Date-UTC>2/27/2014 7:53:17 AM</Detected_Missing_Date-UTC>
    <Detected_Missing_Date-LocalTime>2/26/2014 11:53:17 PM</Detected_Missing_Date-    LocalTime>
    <Used_Deferrals>1</Used_Deferrals>
  </Compliance_Item>
  <Compliance_Item>
    <Application_Name>VLC media player 2.1.3</Application_Name>
    <Installed_Version>2.1.3</Installed_Version>
    <Required_Version>2.1.4</Required_Version>
    <Detected_Missing_Date-UTC>2/27/2014 7:53:18 AM</Detected_Missing_Date-UTC>
    <Detected_Missing_Date-LocalTime>2/26/2014 11:53:18 PM</Detected_Missing_Date-    LocalTime>
    <Used_Deferrals>1</Used_Deferrals>
  </Compliance_Item>
</Compliance_Items>

我正在遍历应用程序名称列表并向用户显示“升级或推迟”提示。如果他们推迟,我增加一个计数器。该计数器需要写回.XML(即<Used_Deferrals>1</Used_Deferrals>应该成为<Used_Deferrals>2</Used_Deferrals>

我可以遍历每个子元素组,并查找element.name与我正在处理的应用程序的名称相匹配的位置,但是从那里我不知道如何选择相邻的子元素以便我可以更新它的价值。

1 个答案:

答案 0 :(得分:0)

使用XDocument LINQ to XML类:

var xDoc = XDocument.Parse(...);
var elementToUpdate = xDoc.Root
                          .Descendants("Compliance_Item")
                          .Single(ci => ci.Element("Application_Name").Value == "Notepad++")
                          .Element("Used_Deferrals");
elementToUpdate.Value = (Int32.Parse(elementToUpdate.Value) + 1).ToString();

但是,如果您计划对结构进行更复杂的操作,那么在处理之前遵循@ Abhinav的建议并反序列化XML确实很有用。