【问题标题】:Error in Deserializing XML file反序列化 XML 文件时出错
【发布时间】:2012-07-02 05:17:07
【问题描述】:

我正在尝试反序列化 XML 并显示其元素中的值,但出现此错误:

我刚刚从互联网上找到了一些示例,并尝试根据我的需要编辑代码,但我认为我做得不对。请参阅下面的类和示例 XML 数据。您的 cmets 和建议将不胜感激。

主窗体

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

记录

public class Record
{
    public string Material_Code;        
    public string Sub_Brand_Code;
    public string Sub_Brand_Text;
    public string Pack_Size_Code;
    public string Pack_Size_Text;
    public string Pack_Type_Code;
    public string Pack_Type_Text;

    public Record()
    {
    }

    public Record(string Material_Code,
              string Sub_Brand_Code,
              string Sub_Brand_Text,
              string Pack_Size_Code,
              string Pack_Size_Text,
              string Pack_Type_Code,
              string Pack_Type_Text
              )

    {
        this.Material_Code = Material_Code;         
        this.Sub_Brand_Code = Sub_Brand_Code;
        this.Sub_Brand_Text = Sub_Brand_Text;
        this.Pack_Size_Code = Pack_Size_Code;
        this.Pack_Size_Text = Pack_Size_Text;
        this.Pack_Type_Code = Pack_Type_Code;
        this.Pack_Type_Text = Pack_Type_Text;

    }
}

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>

【问题讨论】:

  • 我认为XmlSerializer xml = new XmlSerializer(lst.GetType()) 应该改为XmlSerializer xml = new XmlSerializer(typeof(Record));。此外,因为顶级父标记是&lt;/MntProdHierAttrMDM&gt;,您应该创建一个继承自List&lt;Record&gt; 的对象,该对象具有XmlElement 属性作为MntProdHierAttrMDM。目前,xml 反序列化器不知道MntProdHierAttrMDM 的含义,因为默认情况下List&lt;Record&gt; 将生成一个顶级元素,如ListOfRecord 或类似的东西。您收到的错误来自顶级标签。
  • 我试过了,还是一样的错误。
  • 你能举个例子吗?我不知道该怎么做。
  • 我刚做了。我不确定 XmlAttribute 是否应该是 [XmlRoot] 或 [XmlElement],但都可以尝试。其中一个将起作用。

标签: c# xml winforms .net-2.0


【解决方案1】:

您需要将命名空间添加到xml中的指定元素。

每当我遇到反序列化问题时,我都会让序列化器为我解决问题;编写代码来序列化对象,并打开序列化器生成的 xml 文件。

有关执行序列化的代码示例,请参阅 http://msdn.microsoft.com/en-us/library/bdxxw552

【讨论】:

  • 我添加了一个指向 msdn 文章的链接,该文章向您展示了如何执行序列化。
【解决方案2】:
[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);
    }
}

【讨论】:

  • 找不到 XmlElement...我应该导入什么命名空间?
  • [XmlElement(ElementName = "MntProdHierAttrMDM")] 用作属性索引器......
  • using System.Xml; 如果光标在 XmlElement 内,您可以通过将鼠标悬停在蓝色摆动线上找到它。
  • 就像我之前所说的,我不确定它是 XMLElement 还是 XmlRoot。在这种情况下,它必须是 XmlRoot
  • 另一种选择是在集合级别使用 XmlArray,在单个项目级别使用 XmlArrayItem。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2015-11-07
  • 2021-11-01
  • 1970-01-01
相关资源
最近更新 更多