12

我有一个相当详细的 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 文件反序列化为类对象,我在帮助程序类中使用了 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);

我收到一个错误,我推断是因为反序列化器正在寻找“模型”节点,但相应的类名是作为根节点和“模型”节点 (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

4 回答 4

12

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

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

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

对于可选属性,仅出现 0 次或 1 次。对于 xsd.exe 工具来说,仅基于单个 XML 示例文件就很难找出类似的事情。

马克

于 2009-09-14T05:01:56.557 回答
11

转到您生成的类并从 [][] ---> [] 更改所有内容

于 2012-01-13T05:51:36.230 回答
3

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

于 2009-09-14T01:38:24.437 回答
0

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

于 2012-05-31T19:20:47.823 回答