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

C# 反序列化XML文件并将值复制到csv中,c#,xml,deserialization,C#,Xml,Deserialization,我想反序列化一个xml文件并将这些值复制到csv文件中 [Serializable, XmlRoot("Configuration"), XmlType("Configuration")] public class LabelRequest { public string weightoz { get; set; } public string MailClass { get; set; }

我想反序列化一个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();
            }

        }
    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());
             }
        }
    }
xml文件如下所示

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

2.
abc

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

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

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

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

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

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

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

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

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

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

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

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


你的尝试结果如何?你有错误吗?数据是否与您预期的不同?具体问题是什么?代码有什么问题?尝试的结果是什么?你有错误吗?数据是否与您预期的不同?具体问题是什么?代码有什么问题?尝试的结果是什么?你有错误吗?数据是否与您预期的不同?具体问题是什么?代码有什么问题?尝试的结果是什么?你有错误吗?数据是否与您预期的不同?详细的问题是什么?你的代码出了什么问题?谢谢。它起作用了。这是一个示例,在我的实际项目中,我有150个变量要在SerializeToCSV中追加。是否有任何方法可以将label的所有值添加到csv,而不必对每个变量使用append?@sindhu,更新了答案以包含反射。如果对您有效,请将其标记为已接受。Thanks在foreach属性中,如果labelRequest.GetType()是类,则对象值保存该类。如果GetType()是类,如何在值中保存字符串?labelRequest.GetType()返回对象的类型。所以在本例中,typeof(labelRequest)。propertyInfo对象包含关于LabelRequest类的属性的信息。要获取调用propertyinfo.GetValue()的属性的值,请调用propertyinfo.SetValue()设置该值。您遇到了什么问题?谢谢。它正在工作。这是一个示例,在我的实际项目中,我有150个变量要在SerializeToCSV中追加。是否有任何方法可以将label的所有值添加到csv,而不必对每个变量都使用append?@sindhu,更新了答案以包含反射。如果对您有效,请将其标记为已接受。Thanks在foreach属性中,如果labelRequest.GetType()是类,则对象值保存该类。如果GetType()是类,如何在值中保存字符串?labelRequest.GetType()返回对象的类型。所以在本例中,typeof(labelRequest)。propertyInfo对象包含关于LabelRequest类的属性的信息。要获取调用propertyinfo.GetValue()的属性的值,请调用propertyinfo.SetValue()设置该值。您遇到了什么问题?谢谢。它正在工作。这是一个示例,在我的实际项目中,我有150个变量要在SerializeToCSV中追加。是否有任何方法可以将label的所有值添加到csv,而不必对每个变量都使用append?@sindhu,更新了答案以包含反射。如果对您有效,请将其标记为已接受。Thanks在foreach属性中,如果labelRequest.GetType()是类,则对象值保存该类。如果GetType()是类,如何在值中保存字符串?labelRequest.GetType()返回对象的类型。所以在本例中,typeof(labelRequest)。propertyInfo对象包含关于LabelRequest类的属性的信息。要获取调用propertyinfo.GetValue()的属性的值,请调用propertyinfo.SetValue()设置该值。您遇到了什么问题?谢谢。它正在工作。这是一个示例,在我的实际项目中,我有150个变量要附加到SerializeToCSV中。是否有任何方法可以添加所有变量