以编程方式从 XML 或 XSD 生成 C# 类

Posted

技术标签:

【中文标题】以编程方式从 XML 或 XSD 生成 C# 类【英文标题】:Generating C# class from XML or XSD programatically 【发布时间】:2021-09-01 09:58:10 【问题描述】:

我有一个生产中的后端应用程序,需要在应用程序接收到的每次 XML 更新后不断更新 XSD 和 C# 类。我正在尝试编写一个可以运行的 C# 代码,它会自动更新 XSD 和 C# 类,因此我不必自己覆盖它(每个月都会有许多新的或更新的字段,需要验证) .

我设法编写了一个从新 XML 生成 XSD 的代码,但还没有看到任何(开源)实用程序能够基于其中之一创建 C# 对象类。我知道我可以使用以下内容:

Process.Start("....xsd.exe", params)

但是,对于更多用户来说,解决方案应该是通用的,xsd.exe的路径对每个人来说都不一样。

您对我应该如何处理有什么建议吗?

【问题讨论】:

为什么必须一直更新 schema?模式不是从 XML 文件生成的,而是相反 - 编写 XML 文档以便它们符合模式。更改架构是一项重大的重大更改。如果一个本应定义良好的文档结构一直在变化,那就大错特错了。如果架构更改如此频繁,您可能不应该使用它来反序列化或生成 C# 类。 即使架构每个月都会发生变化,您也不必从可能包含或不包含所有元素和组合的文件内容中猜测它。为什么不使用实际发布的架构? 你的应用程序架构在这里全错了。如果架构经常更改,那么数据绑定(将 XML 元素映射到 C# 类)是错误的设计。并且针对从实例生成的架构进行验证是没有用的 - 如果您正确生成了它,那么该实例将始终有效。 关键是我们会在我们同意的每个更改中向客户提供新的数据样本。首先,我们更新我们发送给他们的样本,他们根据样本调整他们的客户端应用程序。有时他们出于某种原因在发送有效的 XML 时遇到问题,因此我们需要保持 xsds 的更新,并且在我们的解析器代码中使用对象而不是手动解析字段也更舒服。如果不以编程方式更新类,每次所需数据样本发生变化时,我们都必须手动添加一个属性。 【参考方案1】:

毕竟我设法编写了一个通用的 .bat 文件,它像这样在所有需要的 xsd 上调用 xsd.exe

for /R %%f in (*.xsd) do (
xsd /c "%%f" /outputdir:..\Objects /n:DataSource.Main.xsd.Objects)

并以编程方式运行此文件。此解决方案的唯一缺点是您需要将 xsd.exe 添加到 PATH。

【讨论】:

以上是关于以编程方式从 XML 或 XSD 生成 C# 类的主要内容,如果未能解决你的问题,请参考以下文章

XSD2Code++,从 XML 枚举到没有顺序值的 C# 枚举

如何将 XML 映射到 C# 对象

从 C# 类代码生成 xsd 注释和文档标签

使用 XSD 文件在 C# 中生成 XML 文件

如何从其 DTD 或 XSD 生成示例 XML 文档?

为 C# 生成的 XML 文档的 XSD? [关闭]