XML反序列化到XSD生成的类中的麻烦

我有一个相当详细的xml文件。 下面是顶级节点(我已经包含了椭圆,因为较低级别的节点都已经很好地形成并且正确地填充了数据):

  ... ...  

我使用Visual Studio 2008命令提示符创建了一个xsd文件:

 xsd sample.xml 

这会很好地生成xsd文件。 然后我使用以下命令从xsd自动生成类:

 xsd sample.xsd /classes 

为了将xml文件反序列化为类对象,我在helper类中使用了read函数:

 public class XmlSerializerHelper { public Type _type; public XmlSerializerHelper() { _type = typeof(T); } public void Save(string path, object obj) { using (TextWriter textWriter = new StreamWriter(path)) { XmlSerializer serializer = new XmlSerializer(_type); serializer.Serialize(textWriter, obj); } } public T Read(string path) { T result; using (TextReader textReader = new StreamReader(path)) { XmlSerializer deserializer = new XmlSerializer(_type); result = (T)deserializer.Deserialize(textReader); } return result; } } 

尝试反序列化时:

 var helper = new XmlSerializerHelper(); var obj = new configModels(); obj = helper.Read(filepath); 

我收到一个错误,我推断是因为解串器正在寻找’Models’节点,但相应的类名是作为根节点和’Model’节点(configModels)的组合生成的。 为什么类名生成如下?

我尝试使用以下命令从顶级节点反序列化:

 var helper = new XmlSerializerHelper(); var obj = new config(); obj = helper.Read(filepath); 

不幸的是,这导致了一系列错误,如下所示:

 System.InvalidOperationException was unhandled by user code Message="Unable to generate a temporary class (result=1). error CS0030: Cannot convert type 'Application.Lease[]' to 'Application.Lease' error CS0030: Cannot convert type 'Application.CashFlow[]' to 'Application.CashFlow' ...ect. 

有人可以引导我走向我的xsd自动生成错误吗?

XSD.EXE是一个良好的开端 – 但它远非完美。 此外,根据您提供的XML,XSD.EXE无法始终确定某些内容是对象的单个实例,还是开放式对象数组。

这似乎就是你的两个元素Application.LeaseApplication.CashFlow 。 它们是如何在生成的XSD文件中定义的? 这对你有意义吗? 很可能,你必须添加一些提示,例如:

  

对于可选属性,仅为零或一次出现。 这样的事情对于xsd.exe工具来说很难根据单个XML样本文件来确定。

转到生成的类并从[] [] —> []更改所有类

xsd.exe和列表存在问题。 您必须进入生成的类并手动将文件编辑为正确的类型。 我已经切换到使用Xsd2Code。 到目前为止,似乎没有这个问题。

可能导致此问题的另一个问题是标记(意味着内容)之间的xml文件内容仍然在不应该编码时进行编码。 例如,我的内容中的
代码仍然是
而不是<br /> 。 xsd生成器将这些元素转换为模式中的元素,然后将它们错误地标记为无界,因为找到了多个元素。 取消编码修复问题并正确生成类。