为什么我必须删除xmlns属性才能反序列化我的XML文件?

问题

我在简单的设置文件架构上使用Xsd2Code (用于XSD架构的.NET类生成器)。 出于某种原因,当我尝试使用内置的LoadFromFile()Deserialize()方法时,我得到一个似乎与我的XSD和XML文件中的xmlns属性相关的exception。 如果我删除这些属性,则exception消失。 (有关实际导致exception的代码的详细信息,请参阅下面的“ 更新 ”。)


XSD文件

            

XML文件(失败) – 当我尝试反序列化时,我得到一个exception

   SQLEXPRESS CL master  

XML文件(成功) – 反序列化工作正常

   SQLEXPRESS CL master  

exception详细信息 – 如果我运行“失败示例”会发生什么

 A first chance exception of type 'System.InvalidOperationException' occurred in System.Xml.dll System.InvalidOperationException: There is an error in XML document (2, 2). ---> System.InvalidOperationException:  was not expected. at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderSettings.Read3_Settings() --- End of inner exception stack trace --- at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader) at Myco.CLDatabaseBuilder.Models.Settings.Deserialize(String xml) in C:\...\CLDatabaseBuilder\Models\Settings.cs:line 118 at Myco.CLDatabaseBuilder.Models.Settings.LoadFromFile(String fileName) in C:\...\CLDatabaseBuilder\Models\Settings.cs:line 195 at Myco.CLDatabaseBuilder.Program.InitializeSettings() in C:\...\CLDatabaseBuilder\Program.cs:line 68 

问题:

所以基本上,我必须删除默认命名空间才能反序列化。

知道为什么我在使用xmlns时遇到exception吗? 此命名空间声明对于在Visual Studio中进行实时validation非常有用,因此我希望尽可能保留它。

我的XSD根元素属性有问题吗? 我已经搞乱了elementFormDefault (从qualified更改为unqualified ),但这并没有解决问题。


更新

它实际上窒息的代码是这样的:

 Serializer = new System.Xml.Serialization.XmlSerializer(typeof(Myco.CDDatabaseBuilder.Models.Settings)); Serializer.Deserialize(System.Xml.XmlReader.Create(stringReader)); 

如上面的例外所示,我得到的错误是:

不期望

这是否表明在我的Settings类(由Xsd2Code生成的类)中要查找的内容? 这个类中有[System.Xml.Serialization...]属性。 我想知道是否缺少某些东西,或者类(或序列化程序)是否没有对默认xmlns属性进行建模的方法。 任何想法都赞赏。

其中一天……结果我需要四个小角色。

Xsd2Code /xa+中有一个开关,用于设置GenerateXMLAttributes = true

出于某种原因,默认值为false。 好吧,如果你有一个xmlns属性并且想要反序列化,那么它必须是真的。

我不知道问题是什么,但它应该有效。 你很困惑。 我通过.NET SDK附带的xsd.exe工具运行您的架构。 它从您的架构生成此类:

 [XmlType(Namespace="Myco.CLDatabaseBuilder.Models")] [XmlRoot(Namespace="Myco.CLDatabaseBuilder.Models", IsNullable=false)] public partial class Settings { private string sqlServerInstanceNameField; private string databaseNameField; private string rootDatabaseNameField; ///  public string SqlServerInstanceName { get { return this.sqlServerInstanceNameField; } set { this.sqlServerInstanceNameField = value; } } ///  public string DatabaseName { get { return this.databaseNameField; } set { this.databaseNameField = value; } } ///  public string RootDatabaseName { get { return this.rootDatabaseNameField; } set { this.rootDatabaseNameField = value; } } } 

正如您所看到的,装饰课程的属性很少。 有一个XmlType和一个XmlRoot,就是这样。 即使没有XmlElement属性,该类中的三个属性也是隐式序列化的。

我从重新序列化XML得到的结果是这样的:

  SQLEXPRESS CL master