C# 反序列化XML文件时出错

C# 反序列化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 {

我试图反序列化XML并显示其元素中的值,但出现以下错误:

我刚从网上找到一些示例,并尝试根据需要编辑代码,但我认为我做得不对。请参阅下面的类和示例XML数据。我们将非常感谢您的意见和建议

MainForm

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还是XmlRoot。在这种情况下,它必须是XmlRoot。另一个选项可以在集合级别使用XmlArray,在单个项级别使用XmlArrayItem。找不到XmlElement。。。我应该导入什么名称空间?
[xmlement(ElementName=“mntprodyerattrmdm”)]
用作属性索引器….
使用System.Xml。正如我前面所说,我不确定它是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);
    }
}