仅修改部分对象属性

时间:2016-04-19 04:41:54

标签: c# xml linq

我有这样的类结构:

[XmlRoot(ElementName = "Details")]
public class Details
{
    [XmlElement(ElementName = "Size")]
    public string Size { get; set; }
    [XmlElement(ElementName = "Length")]
    public string Length { get; set; }
}

[XmlRoot(ElementName = "Notes")]
public class Notes
{
    [XmlElement(ElementName = "Text")]
    public string Text { get; set; }
}

[XmlRoot(ElementName = "Data")]
public class Data
{
    [XmlElement(ElementName = "ID")]
    public string ID { get; set; }
    [XmlElement(ElementName = "Name")]
    public string Name { get; set; }
    [XmlElement(ElementName = "FileName")]
    public string FileName { get; set; }
    [XmlElement(ElementName = "Status")]
    public string Status { get; set; }
    [XmlElement(ElementName = "Date")]
    public string Date { get; set; }
    [XmlElement(ElementName = "Details")]
    public Details Details { get; set; }
    [XmlElement(ElementName = "Notes")]
    public Notes Notes { get; set; }
}

[XmlRoot(ElementName = "AllData")]
public class AllData
{
    [XmlElement(ElementName = "Data")]
    public Data[] Data { get; set; }
}

我有一个要求在哪里,我只想更新这个类的一部分,例如。更新id = 1的数据(Name,fileName,Status,Details等),然后将整个AllData属性写入xml文件。

我正在使用XML序列化程序从XML文件中读取数据,并将其显示在允许用户修改数据的文本框中。一旦用户修改了数据,就必须将其放回到相同的XMl文件中。

我尝试使用linq但没有正确使用它。

这将返回我想要修改的所有相关数据。

Data data= new Data();
data = (from data in AllData.data
      where data.ID == "1"
      select data).FirstOrDefault();

现在我想修改ID = 1的数据: 像这样的东西:

var query = (from records in recordings.Record
             where records.ID == "1"
             select records).Select(x => { x.Name = "foo"; return x; }).FirstOrDefault();

2 个答案:

答案 0 :(得分:1)

LinQ表示 L 集合 q uery 中的 anguage 。它用于查询数据,而不是操纵数据。

您选择了要操作的数据:

var data = (from data in AllData.data where data.ID == "1" select data).ToList();

就个人而言,我更喜欢方法语法,但它确实是相同的:

var data = AllData.data.Where(data => data.ID == "1").ToList();

现在您拥有了数据,您需要对其进行操作。用老式的方式:

foreach(var d in data)
{
    d.Name = "foo";
}

现在您的数据已更改。您可能希望显示更改或将其写入文件。

答案 1 :(得分:0)

由于您使用的是C#类,因此您只需将这些对象序列化回Xml,不太确定为什么要直接处理Xml

您可以使用XmlSerializer序列化Xml并保存文件。

 XmlSerializer serializer = new XmlSerializer(typeof(AllData));
 using(StringWriter sww = new StringWriter())
 using(XmlWriter writer = XmlWriter.Create(sww))
 {
     serializer.Serialize(writer, alldata); // your object
     var xml = sww.ToString(); // your xml.
     // save your xml
 }