2014-02-27 119 views
1

我有一个.XML文件看起来像以下:基于相邻孩子有选择地更新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>

我可以通过每个子元素组的foreach,寻找在那里element.name我目前正在处理的应用程序的名称相匹配,但从那里,我不知道如何选择相邻的子元素,这样我可以更新它的值

+1

为什么不将XML反序列化为相应的Class文件?修改实例并将序列化流写入XML。 – Abhinav

回答

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

但是,如果你打算多一些对结构的复杂操作,它确实可能对follo有用w @ Abhinav的建议并在处理之前对XML进行反序列化。