C# 反序列化XML文件并将值复制到csv中
我想反序列化一个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; }
[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中。是否有任何方法可以添加所有变量