XML反序列化过程中出现“未知节点:变量名”的错误。

4
我有一个样例XML文件需要反序列化:

我有这个样本XML文件,需要进行反序列化:

<?xml version="1.0" encoding="utf-8"?>
<CollectionOfUnits>
    <Unit>
        <StringVar>TohleJeString</StringVar>
        <Int32Var>24</Int32Var>
        <DoubleVar>29.6</DoubleVar>
        <DateTimeVar>17.11.1968</DateTimeVar>
        <CharVar>c</CharVar>
    </Unit>
    <Unit>
        <StringVar>TohleJeTakéString</StringVar>
        <Int32Var>17</Int32Var>
        <DoubleVar>5.9</DoubleVar>
        <DateTimeVar>06.07.1415</DateTimeVar>
        <CharVar>p</CharVar>
    </Unit>
    <Unit>
        <StringVar>NoATohleTaké</StringVar>
        <Int32Var>2</Int32Var>
        <DoubleVar>78.5</DoubleVar>
        <DateTimeVar>06.12.1774</DateTimeVar>
        <CharVar>x</CharVar>
    </Unit>
</CollectionOfUnits>

这是根类,包含另一个类的列表:
[XmlRoot("CollectionOfUnits", IsNullable = false)]
public class XmlExampleCollectionOfUnits
{
    [XmlArray("Unit")]
    public List<XmlExampleBasicUnit> Units { get; set; }
    public XmlExampleCollectionOfUnits(List<XmlExampleBasicUnit> units)
    {
        Units = units;
    }
    public XmlExampleCollectionOfUnits()
    {
    }
}

一个类的结构如下:

public class XmlExampleBasicUnit
{
    public String StringVar { get; set; }
    public Int32 Int32Var { get; set; }
    public Double DoubleVar { get; set; }
    public DateTime DateTimeVar { get; set; }
    public Char CharVar { get; set; }
}

我在调试过程中使用了XmlSerializer文档中的以下函数,它们非常有用(这是输出被调用的地方):

private void serializer_UnknownNode(object sender, XmlNodeEventArgs e)
{
    Console.WriteLine("Unknown Node:" + e.Name + "\t" + e.Text);
}

private void serializer_UnknownAttribute(object sender, XmlAttributeEventArgs e)
{
    XmlAttribute attr = e.Attr;
    Console.WriteLine("Unknown attribute " + attr.Name + "='" + attr.Value + "'");
}

这是输出结果:

Unknown Node:StringVar  
Unknown Node:Int32Var   
Unknown Node:DoubleVar  
Unknown Node:DateTimeVar    
Unknown Node:CharVar    
Unknown Node:StringVar  
Unknown Node:Int32Var   
Unknown Node:DoubleVar  
Unknown Node:DateTimeVar    
Unknown Node:CharVar    
Unknown Node:StringVar  
Unknown Node:Int32Var   
Unknown Node:DoubleVar  
Unknown Node:DateTimeVar    
Unknown Node:CharVar

我认为结构已经编码正确。我是否遗漏了某些指定?

3
[XmlArray] 表示二级层次结构 - 你可能需要使用 [XmlElement("Unit")] - Marc Gravell
1个回答

5
这里有三个问题;
  • 你需要的是 XmlElementAttribute,而不是 XmlArrayAttribute,因为你只有一级嵌套,所以: [XmlElement("Unit")]
  • 你的日期格式不符合xml格式;要么按照适当的格式进行格式化(ISO 8601 ,如: 1968-11-17 等),要么使用 string 类型,并在之后手动转换为 DateTime
  • char 类型不太适合——它本质上是一个整数类型;应该使用 string 替代
通过这些更改:就可以正常工作了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接