反序列化XML文件并将值复制到csv中

本文关键字:复制 csv XML 文件 反序列化 | 更新日期: 2023-09-27 17:59:03

我想反序列化一个xml文件,并将这些值复制到csv文件中。

 [Serializable, XmlRoot("Configuration"), XmlType("Configuration")]
        public class LabelRequest
        {
           public string weightoz { get; set; }
           public string MailClass { get; set; }
            public static void DeSerialization()
            {
               LabelRequest label = new LabelRequest();
               TextReader txtReader = new StreamReader(@"C:'xmlfile.xml");
               XmlSerializer xmlSerializer = new XmlSerializer(typeof(LabelRequest));
               label = (LabelRequest) xmlSerializer.Deserialize(txtReader);
               txtReader.Close();
            }
        }

xml文件如下

<Labelrequest>
     <weightoz>2</weightoz>
     <mailclass>abc</mailclass>
</labelrequest>

反序列化XML文件并将值复制到csv中

将值写入CSV文件应该不会太困难。不过,您的示例不包含任何写入文件的代码。它只是取消序列化一个XML文件。我可以提出这样的建议吗。

    public static class LabelRequestSerializer
    {
        public static Label DeserializeXmlFile(string fileName)
        {
           using (TextReader txtReader = new StreamReader(fileName))
           {
               XmlSerializer xmlSerializer = new XmlSerializer(typeof(LabelRequest));
               LabelRequest label = (LabelRequest) xmlSerializer.Deserialize(txtReader);
           }
        }
        public static void SerializeToCsv(LabelRequest labelRequest, string fileName)
        {
             if (labelRequest == null)
                throw new ArgumentNullException("labelRequest");
             StringBuilder sb = new StringBuilder();
             sb.Append(labelRequest.weightoz);
             sb.Append(",");
             sb.Append(labelRequest.mailclass);
             sb.AppendLine();
             using (StreamWriter stream = new StreamWriter(fileName))
             {
                 stream.Write(sb.ToString());
             }
        }
    }

然后,您可以将要序列化的LabelRequest实例传递给这些静态方法。这样一来,LabelRequest就不知道如何从文件中序列化自己,这是一个很好的关注点分离。像这个

void SomeMethod()
{
    LabelRequest labelRequest = new LabelRequest();
    LabelRequestSerializer.SerializeToCsv(labelRequest, @"C:'Path'Goes'Here'label.csv");
}

编辑。。。

如果你真的不想手动写出每个属性,你可以使用反射。然而,使用此功能会对性能造成影响。不过与文件IO相比应该不是问题。

public static void SerializeToCsv(LabelRequest labelRequest, string fileName)
        {
             if (labelRequest == null)
                throw new ArgumentNullException("labelRequest");
             StringBuilder sb = new StringBuilder();
            foreach (PropertyInfo info in labelRequest.GetType() .GetProperties()) 
            {
                   object value =   info.GetValue(labelRequest, null);
                    sb.Append(value);
                    sb.Append(", ");
             } 
             sb.AppendLine();
             using (StreamWriter stream = new StreamWriter(fileName))
             {
                 stream.Write(sb.ToString());
             }
        }