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

dev*_*xer 4 c# xml serialization xsd xml-serialization

问题

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


XSD文件

<?xml version="1.0" encoding="utf-8"?>
<xs:schema
  xmlns="Myco.CLDatabaseBuilder.Models"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="Myco.CLDatabaseBuilder.Models"
  elementFormDefault="qualified">
  <xs:element name="Settings" type="Settings" />
  <xs:complexType name="Settings">
    <xs:sequence>
      <xs:element name="SqlServerInstanceName" type="xs:string" />
      <xs:element name="DatabaseName" type="xs:string" />
      <xs:element name="RootDatabaseName" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

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

<?xml version="1.0" encoding="UTF-8"?>
<Settings
  xmlns="Myco.CLDatabaseBuilder.Models"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="Myco.CLDatabaseBuilder.Models Settings.xsd">
  <SqlServerInstanceName>SQLEXPRESS</SqlServerInstanceName>
  <DatabaseName>CL</DatabaseName>
  <RootDatabaseName>master</RootDatabaseName>
</Settings>
Run Code Online (Sandbox Code Playgroud)

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

<?xml version="1.0" encoding="UTF-8"?>
<Settings
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="Myco.CLDatabaseBuilder.Models Settings.xsd">
  <SqlServerInstanceName>SQLEXPRESS</SqlServerInstanceName>
  <DatabaseName>CL</DatabaseName>
  <RootDatabaseName>master</RootDatabaseName>
</Settings>
Run Code Online (Sandbox Code Playgroud)

异常详细信息 - 如果我运行"失败示例"会发生什么

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: <Settings xmlns='Myco.CLDatabaseBuilder.Models'> 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
Run Code Online (Sandbox Code Playgroud)

问题:

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

知道为什么我使用时会出现异常xmlns吗?此命名空间声明对于在Visual Studio中进行实时验证非常有用,因此我希望尽可能保留它.

我的XSD根元素属性有问题吗?我搞砸了elementFormDefault(qualified改为unqualified),但这并没有解决问题.


更新

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

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

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

<Settings xmlns='Myco.CLDatabaseBuilder.Models'> 没想到.

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

dev*_*xer 8

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

在Xsd2Code /xa+中设置了一个开关GenerateXMLAttributes = true

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