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

时间:2009-09-14 01:26:14

标签: c# .net xsd xsd.exe

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

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <Models>...</Models>
    <Data>...</Data>
</config>

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

xsd sample.xml

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

xsd sample.xsd /classes

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

public class XmlSerializerHelper<T>
{
    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<configModels>();
var obj = new configModels();
obj = helper.Read(filepath);

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

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

var helper = new XmlSerializerHelper<config>();
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自动生成错误吗?

4 个答案:

答案 0 :(得分:11)

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

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

<xs:element name="Lease" minOccurs="0" maxOccurs="1" />

对于可选属性,仅为零或一次出现。 xsd.exe工具很难根据单个XML样本文件找出类似的东西。

马克

答案 1 :(得分:10)

转到生成的课程并从[] [] ---&gt;更改所有课程[]

答案 2 :(得分:3)

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

答案 3 :(得分:0)

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