c# - XML 反序列化期间的“未知节点:VarName”
问题描述
我有这个需要反序列化的示例 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个问题;
- 你想要
XmlElementAttribute
,而不是XmlArrayAttribute
,因为你只有一层嵌套,所以:[XmlElement("Unit")]
- 您的日期作为 xml 格式的日期无效;或者适当地格式化它们(ISO 8601,所以:
1968-11-17
等),或者使用string
而不是DateTime
然后手动转换它 - 该
char
类型不太合适——它本质上是一个整数类型;string
改为使用
通过这些更改:它应该可以工作。