C#XmlSerializer不接受从W3C XMLschema.xsd(xsd验证的架构)生成的xsd.exe C#类

本文关键字:xsd exe XMLschema W3C 不接受 C#XmlSerializer 验证 | 更新日期: 2023-09-27 17:59:37

实用程序"xsd.exe"将生成以各种方式与xsd模式文件中的信息相对应的c#类源代码。

因此,我下载了位于"http://www.w3.org/2001/XMLSchema"--这是xsd文件本身的模式。

我使用生成与"模式换模式"相对应的C#类

xsd.exe /classes /namespace:w3c XMLSchema.xsd

到目前为止还不错。我在命名空间"w3c"中得到一个包含C#类"schema"和其他内容的文件"XMLSchema.cs",我将其添加到一个C#项目中,该项目还包含以下内容:

try
{
    XmlSerializer loader = new XmlSerializer(typeof(w3c.schema));
    //never here!! previous line throws!
    FileStream fs = new FileStream(
        @"M:'src'Interfaces'MyClass1.xsd", FileMode.Open, FileAccess.Read
        );
    object fromXml = loader.Deserialize(fs);
    w3c.schema MyClass1Schema = (w3c.schema)fromXml;
}
catch(Exception e)
{
}

不幸的是,它在try块的第一行抛出了以下错误:

来自的XML元素"annotation"命名空间'http://www.w3.org/2001/XMLSchema'是已存在于当前范围中。使用XML属性指定另一个元素的XML名称或命名空间。

有人经历过这个错误吗?

我不想对生成的文件"XMLSchema.cs"进行任何修改。

我也(最初)尝试过:

xsd /classes XMLSchema.xsd

(在C#测试代码中没有名称空间),结果相同。

C#XmlSerializer不接受从W3C XMLschema.xsd(xsd验证的架构)生成的xsd.exe C#类

我猜问题与.NET名称空间无关,正如您在第二个命令中猜测的那样,而是与XML名称空间有关。

您遇到的问题似乎是XSD文件定义了XML序列化程序已经使用的命名空间(可能是xsd)(对于XSD的XSD,令人惊讶的是)。

我不确定XML规范对具有不同标识符的两个等效名称空间的说明,但解决此问题的正确方法是更改输入XSD文件的名称空间。当然,这会使它无效,但我认为它会阻止XmlSerializer抛出。

我认为您不能在typeof()中使用namespace,而是放上您试图序列化的对象(类的实例)的名称。