使用 XSD.exe 的多个版本 C# 类/XSD

Posted

技术标签:

【中文标题】使用 XSD.exe 的多个版本 C# 类/XSD【英文标题】:Multiple Versions C# classes/XSD using XSD.exe 【发布时间】:2021-05-20 10:06:27 【问题描述】:

我正在使用 XSD.exe 将相当复杂的 XML 架构(XSD 文件)转换为 C# 类。然后我使用 XmlSerializer 将 XML 读入内存并处理数据。

将来,XSD 会发生变化。所以会有新版本。我将不得不使用 XSD.exe 创建一个新的 cs 文件。但我还是想支持旧版本的 XML 文件。

解决此问题并同时支持新旧版本的 XML 文件的最佳方法是什么?显然,XSD.exe 创建的类将具有相同的名称。所以我真的不能只生成另一个与 XSD.exe 并行的 cs 文件。

欢迎任何想法。提前致谢!

【问题讨论】:

希望创建 xsd 的人只添加新功能而不更改现有功能。然后代码将同时处理新旧数据。只要你有一个数据库,你就应该包含一个版本号,这样你就可以编写读取版本号并处理差异的代码。 【参考方案1】:

XML 数据绑定的优点是可以针对强类型类而不是无类型节点进行编码,但这会使版本控制变得棘手。

有关这方面的信息可以在Liquid XML Data Binder 2021 - Getting Started 文档的“架构版本控制”部分中找到。

【讨论】:

【参考方案2】:

当架构很大、复杂或不断变化时,数据绑定技术(将 XSD 定义转换为强类型编程语言中的类型)绝对是一种痛苦。我强烈的建议是,找到不同的方法。我赚了很多咨询费,帮助人们从这个漏洞中挖掘出来。

使用更擅长应对变化和多样性的技术。 XSLT、XQuery、LINQ 甚至 DOM,如果必须的话。 XSLT 和 XQuery 作为一个选项提供模式感知功能,因此您可以获得一些好处(根据模式检查您的程序代码),而无需在每次发生更改时都重新构建和重新测试您的应用程序。

【讨论】:

【参考方案3】:

感谢您的回答。

目前,我将 XSD.exe 生成的代码放在单独的命名空间中,并让它们派生自基类。

像这样,我可以使用一个或另一个类来生成/读取 XML。它现在似乎对我有用,因为没有新版本,架构不会改变。所做的任何更改都将放入新版本中。

【讨论】:

以上是关于使用 XSD.exe 的多个版本 C# 类/XSD的主要内容,如果未能解决你的问题,请参考以下文章

引用通用类型的 XSD Gen 类

使用 xsd.exe 或 svcutil.exe 对 UWP 和 Xamarin 进行 C# XML 序列化

使用 xsd.exe 命令工具将 xsd 架构生成 类(CS) 文件

如何将 XML 映射到 C# 对象

从使用 XSD.exe 生成的 XML 中反序列化类

在不修改 C# XSD 类的情况下向 XML 序列化添加前缀和命名空间