C# 反序列化XML文件时出错
我试图反序列化XML并显示其元素中的值,但出现以下错误: 我刚从网上找到一些示例,并尝试根据需要编辑代码,但我认为我做得不对。请参阅下面的类和示例XML数据。我们将非常感谢您的意见和建议 MainFormC# 反序列化XML文件时出错,c#,xml,winforms,.net-2.0,C#,Xml,Winforms,.net 2.0,我试图反序列化XML并显示其元素中的值,但出现以下错误: 我刚从网上找到一些示例,并尝试根据需要编辑代码,但我认为我做得不对。请参阅下面的类和示例XML数据。我们将非常感谢您的意见和建议 MainForm public partial class MainForm : Form { public MainForm() { InitializeComponent(); } public FileInfo ItemFile {
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
public FileInfo ItemFile
{
get
{
return new FileInfo(@"C:\Data_120702-015842_440.xml");
}
}
void MainFormLoad(object sender, EventArgs e)
{
if (ItemFile.Exists)
{
List<Record> lst = new List<Record>();
XmlSerializer xml = new XmlSerializer(lst.GetType());
using (Stream s = ItemFile.OpenRead())
{
lst = xml.Deserialize(s) as List<Record>;
}
_items.Add(item);
MessageBox.Show(lst[0].Material_Code);
}
}
}
XML结构
<?xml version="1.0" encoding="UTF-8"?>
<MntProdHierAttrMDM>
<Record>
<Material_Code>60024517</Material_Code>
<Sub_Brand_Code>SB000416</Sub_Brand_Code>
<Sub_Brand_Text>Zwitsal</Sub_Brand_Text>
<Pack_Size_Code>PS000224</Pack_Size_Code>
<Pack_Size_Text>50ML</Pack_Size_Text>
<Pack_Type_Code>PT000042</Pack_Type_Code>
<Pack_Type_Text>BOTTLE</Pack_Type_Text>
</Record>
</MntProdHierAttrMDM>
60024517
SB000416
兹维塔尔
PS000224
50毫升
PT000042
瓶子
[XmlRoot(ElementName=“mntprodyerattrmdm”)]
公共类记录集合:列表
{
public RecordCollection():base(){}
公共记录收集(int容量):基本(容量){}
}
void MainFormLoad(对象发送方,事件参数)
{
if(ItemFile.Exists)
{
RecordCollection lst=新的RecordCollection();
XmlSerializer xml=新的XmlSerializer(typeof(RecordCollection));
使用(Stream s=ItemFile.OpenRead())
{
lst=xml。反序列化为RecordCollection;
}
_项目。添加(项目);
MessageBox.Show(lst[0]。物料编码);
}
}
[XmlRoot(ElementName=“mntprodyerattrmdm”)]
公共类记录集合:列表
{
public RecordCollection():base(){}
公共记录收集(int容量):基本(容量){}
}
void MainFormLoad(对象发送方,事件参数)
{
if(ItemFile.Exists)
{
RecordCollection lst=新的RecordCollection();
XmlSerializer xml=新的XmlSerializer(typeof(RecordCollection));
使用(Stream s=ItemFile.OpenRead())
{
lst=xml。反序列化为RecordCollection;
}
_项目。添加(项目);
MessageBox.Show(lst[0]。物料编码);
}
}
您需要将名称空间添加到xml中的指定元素中
每当遇到反序列化问题时,我都让序列化程序为我解决问题;编写序列化对象的代码,并打开序列化程序生成的xml文件
有关执行序列化的代码示例,请参见。您需要将名称空间添加到xml中的指定元素 每当遇到反序列化问题时,我都让序列化程序为我解决问题;编写序列化对象的代码,并打开序列化程序生成的xml文件
查看执行序列化的代码示例。我认为说
XmlSerializer xml=new XmlSerializer(lst.GetType())
的那一行应该说XmlSerializer xml=new XmlSerializer(typeof(Record))代码>取而代之。另外,由于顶部父标记是
,因此您应该创建一个从列表继承的对象,该对象的xmlement
属性为mntprodyerattrmdm
。目前,xml反序列化程序不知道mntprodyerattrmdm
是什么意思,因为默认情况下List
将生成一个顶级元素,如ListOfRecord
或类似的内容。您收到的错误来自顶层标记。我已经尝试过了,但还是相同的错误。您能举个例子吗?我不知道怎么做,我只是做了。我不确定XmlAttribute应该是[XmlRoot]还是[XmlElement],但请尝试其中一种。我认为说XmlSerializer xml=newxmlserializer(lst.GetType())
的那一行应该说XmlSerializer xml=newxmlserializer(typeof(Record))代码>取而代之。另外,由于顶部父标记是
,因此您应该创建一个从列表继承的对象,该对象的xmlement
属性为mntprodyerattrmdm
。目前,xml反序列化程序不知道mntprodyerattrmdm
是什么意思,因为默认情况下List
将生成一个顶级元素,如ListOfRecord
或类似的内容。您收到的错误来自顶层标记。我已经尝试过了,但还是相同的错误。您能举个例子吗?我不知道怎么做,我只是做了。我不确定XmlAttribute应该是[XmlRoot]还是[XmlElement],但请尝试其中一种。其中一个可以工作。找不到XmlElement。。。我应该导入什么名称空间?[xmlement(ElementName=“mntprodyerattrmdm”)]
用作属性索引器….使用System.Xml如果光标在XmlElement内,将鼠标悬停在蓝色摇摆线上可以找到code>。正如我前面所说,我不确定它是XmlElement还是XmlRoot。在这种情况下,它必须是XmlRoot。另一个选项可以在集合级别使用XmlArray,在单个项级别使用XmlArrayItem。找不到XmlElement。。。我应该导入什么名称空间?[xmlement(ElementName=“mntprodyerattrmdm”)]
用作属性索引器….使用System.Xml如果光标在XmlElement内,将鼠标悬停在蓝色摇摆线上可以找到code>。正如我前面所说,我不确定它是XmlElement还是XmlRoot。在这种情况下,它必须是XmlRoot。另一个选项可以在集合级别使用XmlArray,在单个项目级别使用XmlArrayItem。我添加了一个指向msdn文章的链接,向您展示了如何执行序列化。我添加了指向msdn文章的链接,向您展示了如何执行序列化。
<?xml version="1.0" encoding="UTF-8"?>
<MntProdHierAttrMDM>
<Record>
<Material_Code>60024517</Material_Code>
<Sub_Brand_Code>SB000416</Sub_Brand_Code>
<Sub_Brand_Text>Zwitsal</Sub_Brand_Text>
<Pack_Size_Code>PS000224</Pack_Size_Code>
<Pack_Size_Text>50ML</Pack_Size_Text>
<Pack_Type_Code>PT000042</Pack_Type_Code>
<Pack_Type_Text>BOTTLE</Pack_Type_Text>
</Record>
</MntProdHierAttrMDM>
[XmlRoot(ElementName = "MntProdHierAttrMDM")]
public class RecordCollection : List<Record>
{
public RecordCollection() : base(){}
public RecordCollection(int capacity) : base(capacity){}
}
void MainFormLoad(object sender, EventArgs e)
{
if (ItemFile.Exists)
{
RecordCollection lst = new RecordCollection();
XmlSerializer xml = new XmlSerializer(typeof(RecordCollection));
using (Stream s = ItemFile.OpenRead())
{
lst = xml.Deserialize(s) as RecordCollection;
}
_items.Add(item);
MessageBox.Show(lst[0].Material_Code);
}
}