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

标签 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>

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>

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>

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

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

问题:

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

知道为什么我在使用 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));

如上面的异常所示,我得到的错误是:

<Settings xmlns='Myco.CLDatabaseBuilder.Models'> was not expected.

这是否表明在我的 Settings 中寻找任何东西?类(Xsd2Code 生成的类)?有[System.Xml.Serialization...]属性散布在整个类(class)中。我想知道是否缺少某些东西,或者类(或序列化程序)是否没有办法对默认值进行建模 xmlns属性。任何想法表示赞赏。

最佳答案

有那么一天...结果我需要四个小字符。

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

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

关于c# - 为什么我必须删除 xmlns 属性才能反序列化我的 XML 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2113484/

相关文章:

c# - 在 C# 中用 16 位字交换字节序的更快方法

android - TextView 彼此重叠 - Android XML

c# - 在最新的 Razor 引擎中找不到 "image/subfolder"下的图像 - MVC.NET

c# - runspace New-MsolLicenseOptions 命令参数

ios - RSS 在页面上获取图像

c# - 无法从 XML (web.config) 获取两个连接字符串

java - 是否可以使用多个 "root"元素将多个 Java 类对象序列化到单个 XML 文件中?

c# - 使用 XSLT 转换序列化的 .net 对象

json - 什么是grails.converters.deep.JSON的替代品

c# - 使用 Serilog XML 配置指定自定义增强器