【问题标题】:The xsd.exe generated C# class from the W3C XMLschema.xsd (the schema for xsd validation) is not accepted by the C# XmlSerializerC# XmlSerializer 不接受从 W3C XMLschema.xsd(xsd 验证的模式)生成的 xsd.exe 生成的 C# 类
【发布时间】:2011-09-16 19:51:59
【问题描述】:

实用程序“xsd.exe”将生成以各种方式对应于 xsd 架构文件中的信息的 c# 类源代码。

所以,我下载了位于“http://www.w3.org/2001/XMLSchema”的架构文件“XMLSchema.xsd”——这是 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 元素“注释”来自 命名空间 'http://www.w3.org/2001/XMLSchema' 是 已经存在于当前范围内。 使用 XML 属性指定另一个 元素的 XML 名称或命名空间。

有人遇到过这个错误吗?

我宁愿不对生成的文件“XMLSchema.cs”进行任何修改。

我也(最初)尝试过:

xsd /classes XMLSchema.xsd

(并且在 C# 测试代码中没有命名空间)具有相同的结果。

【问题讨论】:

    标签: c# xsd xsd.exe


    【解决方案1】:

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

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

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

    【讨论】:

    • 我会调查一下——我猜希望这个过程是“交钥匙”的。谢谢你的帮助。
    【解决方案2】:

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

    【讨论】:

    • A) 当然你可以为typeof 指定命名空间,并且B) 他得到一个XML 错误,而不是编译器错误
    • @Mike - 只要它用于获取类型的 System.Type 对象。
    • 你还能从中得到什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2014-08-30
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多