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#测试代码中没有名称空间),结果相同。
我猜问题与.NET名称空间无关,正如您在第二个命令中猜测的那样,而是与XML名称空间有关。
您遇到的问题似乎是XSD文件定义了XML序列化程序已经使用的命名空间(可能是xsd
)(对于XSD的XSD,令人惊讶的是)。
我不确定XML规范对具有不同标识符的两个等效名称空间的说明,但解决此问题的正确方法是更改输入XSD文件的名称空间。当然,这会使它无效,但我认为它会阻止XmlSerializer
抛出。
我认为您不能在typeof()中使用namespace,而是放上您试图序列化的对象(类的实例)的名称。