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