将新列添加到现有列表

时间:2019-10-01 16:24:38

标签: c# list xml-parsing

我有一个包含字段的类-Id,名称,公司和另外29个字段。

public class Employee
{
  [XmlAttribute("textbox1")]
  public int Id { get; set; }
  [XmlAttribute("textbox11")]
  public string Name { get; set; }
  [XmlAttribute("textbox21")]
  public string Company { get; set; }
  [XmlAttribute("textbox22")]
  public bool Val1 { get; set; }
  [XmlAttribute("textbox23")]
  public bool Val2 { get; set; }
  public bool TestSomething{get;set;}
}


public class ParseData()
{
   List<Employee> employee = new List<Employee>();
   XmlSerialiser serializer = new XmlSerializer();
   using(FileStream stream = new FileStream("test.xml", FileMode.Open))
   {
       employees = (Employee)serializer.Deserialize(stream);
   }

  //Todo: Add the new calculated value TestSomething

}

我正在反序列化xml数据(具有大约100名员工)中的值。

现在,我有一个新字段“ TestSomething”,该字段未进行反序列化,但将通过反序列化后的值显示,如下所示。有什么方法可以将计算出的值添加到现有的列表员工中吗?

foreach(var i in employees)
{
  employee.TestSomething = (Val1 == true) ? Val1 : Val2;
}

任何对此的建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

下面的代码段是我用来序列化和反序列化xml字符串的扩展方法。请注意,这些必须放置在静态类中,并在该类中引用才能使用。

    /// <summary>
    /// Serializes the object to xml string.
    /// </summary>
    /// <returns>xml serialization.</returns>
    public static string SerializeToXml<T>(this T instance)
        where T : class, new()
    {
        string result;

        var format = new XmlSerializer(typeof(T));
        using (var strmr = new StringWriter())
        {
            format.Serialize(strmr, instance);
            result = strmr.ToString();
        }

        return result;
    }

    /// <summary>
    /// Deserializes xml serialized objects.
    /// </summary>
    /// <param name="xmlDocument">serialized string.</param>
    /// <param name="result">out parameter.</param>
    /// <returns>Instance object.</returns>
    public static bool TryParseXml<T>(this string xmlDocument, out T result)
        where T : class, new()
    {
        result = null;

        if (string.IsNullOrWhiteSpace(xmlDocument))
        {
            return false;
        }

        try
        {
            using (TextReader str = new StringReader(xmlDocument))
            {
                var format = new XmlSerializer(typeof(T));
                XmlReader xmlReader = XmlReader.Create(str);
                if (format.CanDeserialize(xmlReader))
                {
                    result = format.Deserialize(xmlReader) as T;
                }
            }
        }
        catch (InvalidOperationException)
        {
            return false;
        }

        return !(result is null);
    }

在实践中,您将拥有某种类型的类,该类具有要存储到磁盘或数据库等中的属性。可以说我有一个类:

public class MyPoint
{
    public double X { get; set;}
    public double Y { get; set;}
}

如果我想存储MyPoint的列表而又不费劲,我可以直接使用上面的SerializeToXml方法来序列化该类。

var myPoints = new List<MyPoint>{new MyPoint{ X= 1, Y = 2}, new MyPoint{X = 3, Y = 4}};

var xmlString = myPoints.SerializeToXml();

一切都很好,花花公子,我的信息以xml格式保存在某个文件中。但是后来我的老板说:“老兄,对此感到抱歉,但是我们现在需要一个Z值,该值是使用Z = X * X + Y * Y根据每个X和Y来计算的。”

将属性添加到序列化的类中不是问题(将属性取出是!!  序列化程序将尝试为不存在的属性分配值,并引发异常。。但是在这种情况下,我们不必担心。我去了原来的MyPoint类,并添加了一个Z。

public class MyPoint
{
    public double X { get; set;}
    public double Y { get; set;}
    public double Z { get; set;}  // <---- Here
}

现在,当我解析xml时,将获得具有新属性的类。使用TryParseXml,我得到了点列表。

// assume I have a string already from the xml document to use.

List<MyPoint> points = null;

if(serializedPoints.TryParse(out points))
{
    foreach(var point in points)
    {
        point.Z = X * X + Y * Y;
    }
}


var serializedPointsWithZ = points.SerializeToXml();

现在serializedPointsWithZ只是一个可以写入文件等的字符串。