76

我正在研究从 xsd 模式文件生成代码。我的要求:

  • 必须生成 C# 2.0 代码(或更高版本),在需要时使用泛型集合。
  • 必须从 xsd 评论生成评论
  • 必须生成完全可序列化的代码。
  • 从具有相同包含的多个 xsd 生成时,应该能够生成可重用的基本类型。

(另请参阅我的其他问题:如何从 xsd 生成具有公共包含的多个类?以及如何从 wsdl 中的 xs:documentation 标签生成注释?

我找到了以下选项:

  1. 使用 xsd.exe(随 SDK 和 Visual Studio 提供)
  2. Daniel Cazzulino的 XSDCodeGen
  3. Xsd2代码
  4. 代码XS
  5. 微软的XsdObjectGen
  6. XSDClassGen(似乎在行动中失踪)

我错过了吗?因为 (1)、(2) 和 (5) 不生成 2.0 代码,而且我在序列化 (3) 中的代码时遇到问题。生成代码时使用什么?

4

7 回答 7

62

我相信XSD2Code是目前可用的最好的工具(2011 年)。

我最近在分析可用工具时经历了相同的过程,所以我想我会提供与VS2010相关的更新答案。

我们的主要驱动因素是xsd.exe不会从 XSD 注释生成 XML 文档,这是我们想要的,因为我们有数百个类型定义。我尝试了上面列出的所有工具以及其他工具,但大多数工具要么已弃用、未维护或无法匹配 VS2010 中可用的 xsd.exe 的当前功能。

然而, Xsd2Code是一个极好的工具,并且似乎得到了积极的维护。它提供了上面列出的所有功能以及更多功能 - CodePlex 页面还提供了很好的示例,说明了各种选项如何影响输出。

它还具有紧密的 VS 集成,包括上下文菜单集成和自定义构建工具(这意味着如果您在项目中引用 XSD 并指定自定义工具,它将在您更新 XSD 时自动更新代码)。总而言之,为我们节省了很多工作。

我查看的其他工具的快速摘要:

  • Dingo - 似乎更符合 Java
  • XSDCodeGen - 更多关于如何编写自定义构建工具的演示
  • CodeXS - 相当不错的工具,但集成少,功能少,不再维护
  • XSDObjectGen - 不再维护,功能比当前 xsd.exe 少
  • XSDClassGen - 找不到它
  • OXM 库-推荐查看这个项目,维护和强大的功能
  • LINQ to XSD - 非常酷的项目,但不是我想要的

附录: 如果您决定继续使用 XSD2Code,我发现使用命令行工具会出现许多问题。特别是,参数处理存在一些错误,要求某些参数按特定顺序排列,以及一些未记录的依赖项(例如 - 自动参数和 .NET 版本是特定于顺序和依赖的)。以下是我使用 XSD2Code 生成代码然后清理输出的步骤 - 根据需要获取适用于您的位:

运行以下批处理文件以生成初始代码,将路径更改为正确的位置:

@echo off

set XsdPath=C:\schemas
set OutPath=%XsdPath%\Code
set ExePath=C:\Progra~1\Xsd2Code
set Namespace=InsertNamespaceHere

echo.Starting processing XSD files ...
for /f %%a IN ('dir %XsdPath%\*.xsd /a-d /b /s') do call:ProcessXsd %%a

echo.Finished processing XSD files ...
echo.&pause&
goto:eof

:ProcessXsd
%ExePath%\Xsd2Code %~1 %Namespace% %XsdPath%\Code\%~n1%.cs /pl Net35 /if- /dc /sc /eit
echo.Processed %~n1
goto:eof

根据需要执行以下步骤来整理生成的代码:

  1. 正则表达式替换 - 当前项目、案例、整个单词 - [System.Runtime.Serialization.DataContractAttribute(Name:b*=:b*:q,:b Namespace:b =:b*{:q})] 与 [DataContract(命名空间 = \1)]
  2. [DataMember]替换 - 当前项目、案例、整个单词 - [System.Runtime.Serialization.DataMemberAttribute() ]
  3. 正则表达式替换 - 当前项目、案例、整个单词 - System.Nullable\<{:w}>\1\?
  4. 正则表达式替换 - 打开文档、大小写、整个单词 - {:w}TYPE\1
  5. 替换 - 打开文档、案例、整个单词 - System.DateTimeDateTime,然后添加缺少的 using 语句
  6. 替换 - 打开文档、案例、整个单词 - [System.Xml.Serialization.XmlIgnoreAttribute()][XmlIgnore]
  7. XmlArray替换 - 当前项目 - System.Xml.Serialization.XmlArrayAttribute
  8. XmlArrayItem替换 - 当前项目 - System.Xml.Serialization.XmlArrayItemAttribute
  9. 正则表达式替换 - 当前项目 - ,[:Wh]+/// \<remarks/\>,

希望对某人有所帮助。

于 2011-01-19T03:09:35.813 回答
9

我还没有检查过这个,但Linq2XSD可能是一个有用的选择。

我要试试这个。带有 XSD 生成的 LINQ 会比您提到的任何这些工具更好 - 只要它运行良好。

于 2009-07-04T00:03:29.083 回答
3

OpenSource 项目XSD to Classes非常适合我。

于 2011-08-04T15:46:03.300 回答
2

一年多前我的一个项目我们使用了 CodeXS。通过一些小的调整(一个稍微清理了生成代码的脚本),它很有魅力。

还有Dingo,它具有一些非常好的可扩展性功能(我们不需要)。

于 2008-12-22T12:50:55.257 回答
2

试试 OxmLibrary - http://oxmlibrary.codeplex.com

于 2010-12-05T22:14:22.687 回答
0

我发现的最好的 XSD 类生成器是 thinktecture WSCF.blue 。它比大多数其他的更好,原因有两个:

  1. 修复命名。这意味着类型和属性名称的大小写和复数。
  2. 为每个类创建一个单独的文件。

或者,如果您正在寻找 T4 解决方案,您可以尝试 XsdClassGen 。这个不适合我。但好消息是它是 T4 文件,因此很容易修复!

于 2011-10-20T00:57:43.080 回答
-2

这是使用 XSLT 将 XML 转换为 C# 代码的基于 Web 的示例。该示例采用描述服务(基本上是服务名称、命名空间和操作列表)的模型 (XML),然后在 C#.net 中生成 WCF 服务(接口、消息、故障、测试等)。

于 2012-04-26T15:20:27.610 回答