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

时间:2011-06-17 00:12:38

标签: c# xsd xsd.exe

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

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

我使用:

生成与'schema for schemas'对应的C#类
xsd.exe /classes /namespace:w3c XMLSchema.xsd

到目前为止一切顺利。我得到一个文件'XMLSchema.cs',其中包含一个C#类'schema',以及其他东西,在命名空间'w3c'中,我继续添加到一个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#测试代码中没有命名空间)具有相同的结果。

2 个答案:

答案 0 :(得分:0)

我相信你不能在typeof()中使用命名空间,而是把你试图序列化的对象的名称(类的实例)。

答案 1 :(得分:0)

我猜这个问题与.NET命名空间没有任何关系,正如您猜测的第二个命令,但是使用XML命名空间。

您遇到的问题是XSD文件定义了XML Serializer已经使用的命名空间(可能是xsd)(令人惊讶的是,XSD的XSD)。

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