XSD代码生成器的比较

时间:2008-12-22 12:31:36

标签: c# xsd code-generation

我正在从xsd架构文件中进行代码生成方面的一些研究。 我的要求:

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

(另请参阅我的其他问题:How can I generate multiple classes from xsd’s with common includes?How can I generate comments from xs:documentation tags in a wsdl?

我找到了以下选项:

  1. 使用xsd.exe(随SDK和Visual Studio提供)
  2. 来自Daniel Cazzulino
  3. 的XSDCodeGen
  4. Xsd2Code
  5. CodeXS
  6. XsdObjectGen由Microsoft
  7. 提供
  8. XSDClassGen(似乎在行动中失踪)
  9. 我有没有错过?因为(1),(2)和(5)不生成2.0代码,并且我在从(3)序列化代码时遇到问题。生成代码时你会用什么?

7 个答案:

答案 0 :(得分:60)

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

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

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

然而,

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

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

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

  • Dingo - 似乎更符合Java
  • XSDCodeGen - 更多关于如何编写自定义构建工具的演示
  • CodeXS - 相当不错的工具,但集成度较低,功能较少,不再维护
  • XSDObjectGen - 不再维护,功能少于当前的xsd.exe
  • XSDClassGen - 无法找到它
  • OXM Library - 推荐查看此项目,维护并提供强大的功能
  • 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(名称:b * =:b *:q,:b 命名空间:b = :b * {:q})] [DataContract(Namespace = \ 1)]
  2. 替换 - 当前项目,案例,整个单词 - [System.Runtime.Serialization.DataMemberAttribute()] [DataMember]
  3. 正则表达式替换 - 当前项目,案例,整个单词 - System.Nullable \&lt; {:w}&gt; \ 1 \?
  4. 正则表达式替换 - 打开文档,大小写,整个单词 - {:w} TYPE \ 1
  5. 替换 - 打开文档,大小写,整个单词 - System.DateTime DateTime ,然后添加缺少的使用语句
  6. 替换 - 打开文档,案例,整个单词 - [System.Xml.Serialization.XmlIgnoreAttribute()] [XmlIgnore]
  7. 替换 - 当前项目 - System.Xml.Serialization.XmlArrayAttribute XmlArray
  8. 替换 - 当前项目 - System.Xml.Serialization.XmlArrayItemAttribute XmlArrayItem
  9. 正则表格替换 - 当前项目 - ,[:Wh] + /// \&lt; remarks / \&gt;
  10. 希望能有所帮助。

答案 1 :(得分:8)

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

我打算给这个人一个机会。具有XSD生成的LINQ将优于您提到的任何这些工具 - 只要它运行良好。

答案 2 :(得分:3)

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

答案 3 :(得分:2)

我在一年多前的一个项目中使用了CodeXS。通过一些微小的调整(一个脚本可以清理生成的代码),它起到了一定的作用。

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

答案 4 :(得分:2)

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

答案 5 :(得分:0)

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

  1. 修复命名。这意味着套管和类型和属性名称的多样化。
  2. 为每个类创建一个单独的文件。
  3. 或者,如果您正在寻找T4解决方案,您可以尝试 XsdClassGen 。 这个不适合我。但好消息是它是一个T4文件,因此很容易修复!

答案 6 :(得分:-1)

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