C# C语言中的XML序列化与反序列化#
假设我有一个XML,我想转换成.net对象。我怎么能做到这一点呢?我试过了,但它不能正常工作C# C语言中的XML序列化与反序列化#,c#,.net,xml-serialization,C#,.net,Xml Serialization,假设我有一个XML,我想转换成.net对象。我怎么能做到这一点呢?我试过了,但它不能正常工作 <job id="ID00004" name="PeakValCalcO"> <uses file="Seismogram_FFI_0_1_ID00003.grm" link="input" /> <uses file="PeakVals_FFI_0_1_ID00003.bsa" link="output" /> </job> <job id
<job id="ID00004" name="PeakValCalcO">
<uses file="Seismogram_FFI_0_1_ID00003.grm" link="input" />
<uses file="PeakVals_FFI_0_1_ID00003.bsa" link="output" />
</job>
<job id="ID00005" name="SeismogramSynthesis" >
<uses file="FFI_0_1_txt.variation-s07930-h00000" link="input" />
<uses file="Seismogram_FFI_0_1_ID00005.grm" link="output" />
</job>
公共类作业:列表{}
公开课工作
{
公共字符串id{get;set;}
公共字符串名称{get;set;}
公共列表文件{get;set;}
}
公共类用途
{
公共字符串文件{get;set;}
公共字符串链接{get;set;}
}
私有void Form1\u加载(对象发送方、事件参数e)
{
XmlSerializer serializer=新的XmlSerializer(作业类型));
TextReader tr=新的StreamReader(“CyberShake_100.xml”);
作业b=(作业)序列化程序。反序列化(tr);
tr.Close();
}
您可以使用XSD.exe工具生成与XML匹配的类结构。这可能是拥有可工作的序列化对象层次结构的最简单方法。您可以使用XSD.exe工具生成与XML匹配的类结构。这可能是拥有可工作的序列化对象层次结构的最简单方法。您需要了解
上的id
和name
是XML属性,您还需要在类中表示这些属性:
public class jobs : List<job> { }
public class job
{
public string id { get; set; }
public string name { get; set; }
public List<uses> Files { get; set; }
}
public class uses
{
public string file { get; set; }
public string link { get; set; }
}
private void Form1_Load(object sender, EventArgs e)
{
XmlSerializer serializer = new XmlSerializer(typeof(jobs));
TextReader tr = new StreamReader("CyberShake_100.xml");
job b = (job)serializer.Deserialize(tr);
tr.Close();
}
公共类作业
{
[XmlAttribute]
公共字符串id{get;set;}
[XmlAttribute]
公共字符串名称{get;set;}
公共列表文件{get;set;}
}
这同样适用于
标记及其类表示
另外:一个有效的XML文档总是有一个根元素,并且只有一个根-您的XML片段不是一个有效的XML文档。您需要了解
上的id
和name
是XML属性-您也需要在类中表达:
public class jobs : List<job> { }
public class job
{
public string id { get; set; }
public string name { get; set; }
public List<uses> Files { get; set; }
}
public class uses
{
public string file { get; set; }
public string link { get; set; }
}
private void Form1_Load(object sender, EventArgs e)
{
XmlSerializer serializer = new XmlSerializer(typeof(jobs));
TextReader tr = new StreamReader("CyberShake_100.xml");
job b = (job)serializer.Deserialize(tr);
tr.Close();
}
公共类作业
{
[XmlAttribute]
公共字符串id{get;set;}
[XmlAttribute]
公共字符串名称{get;set;}
公共列表文件{get;set;}
}
这同样适用于
标记及其类表示
另外:一个有效的XML文档总是有一个根元素,并且只有一个根-您的XML片段不是一个有效的XML文档。这不是一个有效的XML文档,因为它有多个根。这就是为什么不能使用框架中的现成内容。这不是有效的XML文档,因为它有多个根。这就是为什么您不能使用框架中的现成内容。至少您需要id、名称、文件和链接成员上的
[xmldattribute]
您还强制转换到错误的类型,应该是
jobs b=(jobs)serializer代码>至少您需要id、名称、文件和链接成员上的[xmldattribute]
您还强制转换到错误的类型,应该是jobs b=(jobs)serializer代码>嗯,这里有几件事不对:
1)您的xml文档没有根元素
它需要看起来更像这样:
public class job
{
[XmlAttribute]
public string id { get; set; }
[XmlAttribute]
public string name { get; set; }
public List<uses> Files { get; set; }
}
<jobs>
<job id="ID00004" name="PeakValCalcO">
<uses file="Seismogram_FFI_0_1_ID00003.grm" link="input" />
<uses file="PeakVals_FFI_0_1_ID00003.bsa" link="output" />
</job>
<job id="ID00005" name="SeismogramSynthesis" >
<uses file="FFI_0_1_txt.variation-s07930-h00000" link="input" />
<uses file="Seismogram_FFI_0_1_ID00005.grm" link="output" />
</job>
</jobs>
对于复杂的xml文档,这往往会变得有点乏味-有一个工具XSD.exe
,可以为您自动完成所有这些
3)您选择了错误的类型
即使序列化成功,您也会得到一个invalidcastexpation
尝试将作业
实例转换为作业
。请尝试以下方法:
[XmlRoot("jobs")]
public class jobs : List<job> { }
public class job
{
[XmlAttribute]
public string id { get; set; }
[XmlAttribute]
public string name { get; set; }
[XmlElement("uses")]
public List<uses> Files { get; set; }
}
public class uses
{
[XmlAttribute]
public string file { get; set; }
[XmlAttribute]
public string link { get; set; }
}
嗯,这里有几件事不对:
1)您的xml文档没有根元素
它需要看起来更像这样:
public class job
{
[XmlAttribute]
public string id { get; set; }
[XmlAttribute]
public string name { get; set; }
public List<uses> Files { get; set; }
}
<jobs>
<job id="ID00004" name="PeakValCalcO">
<uses file="Seismogram_FFI_0_1_ID00003.grm" link="input" />
<uses file="PeakVals_FFI_0_1_ID00003.bsa" link="output" />
</job>
<job id="ID00005" name="SeismogramSynthesis" >
<uses file="FFI_0_1_txt.variation-s07930-h00000" link="input" />
<uses file="Seismogram_FFI_0_1_ID00005.grm" link="output" />
</job>
</jobs>
对于复杂的xml文档,这往往会变得有点乏味-有一个工具XSD.exe
,可以为您自动完成所有这些
3)您选择了错误的类型
即使序列化成功,您也会得到一个invalidcastexpation
尝试将作业
实例转换为作业
。请尝试以下方法:
[XmlRoot("jobs")]
public class jobs : List<job> { }
public class job
{
[XmlAttribute]
public string id { get; set; }
[XmlAttribute]
public string name { get; set; }
[XmlElement("uses")]
public List<uses> Files { get; set; }
}
public class uses
{
[XmlAttribute]
public string file { get; set; }
[XmlAttribute]
public string link { get; set; }
}
什么是不正确的?您是否收到错误或读取对象出错?如果收到错误,您会收到什么错误消息?无错误它不会在作业b=(作业)序列化程序后运行。反序列化(tr);别忘了处理StreamReader:)@Disposer为纪念他的尼克而战斗;)什么是不正确的?您是否收到错误或读取对象出错?如果收到错误,您会收到什么错误消息?无错误它不会在作业b=(作业)序列化程序后运行。反序列化(tr);别忘了处理StreamReader:)@Disposer为纪念他的尼克而战斗;)你是对的,但是XSD工具为你的代码添加了很多东西!也许有一些技巧我不知道,但当我使用它时,它使用7行XML文件创建了一个大约800行的.cs
文件。你是对的,但是XSD工具为你的代码添加了很多东西!也许有一些技巧我不知道,但当我使用它时,它使用7行XML文件创建了一个大约800行的.cs
文件。