【问题标题】:Comparison of XSD Code Generators [closed]XSD 代码生成器的比较 [关闭]
【发布时间】:2010-09-28 00:29:58
【问题描述】:

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

  • 必须生成 C# 2.0 代码(或更高版本),并在需要时使用泛型集合。
  • 必须从 xsd cmets 生成 cmets
  • 必须生成完全可序列化的代码。
  • 当从具有相同包含的多个 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的XSDCodeGen
  3. Xsd2Code
  4. CodeXS
  5. XsdObjectGen 来自微软
  6. XSDClassGen(似乎在行动中失踪了)

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

【问题讨论】:

标签: c# xsd code-generation


【解决方案1】:

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

希望对某人有所帮助。

【讨论】:

  • 我必须同意 Xsd2Code 目前是冠军。如果您手动或通过 GPO 移动了默认的“文档”位置,请注意加载项未正确加载。解决方案是从安装位置获取加载项文件并将其放在 Documents\Visual Studio 2010\Addins\ 文件夹中。
  • xsd2code 似乎死了。我希望一个新版本即将发布,有一个主要的阻塞错误和一些其他错误阻止我们实际使用它。
  • 请注意:我在 Nuget 上遇到了 XsdClassGen(请参阅 nuget.org/List/Packages/XsdClassGen)。它使用了一个 T4 模板,很好,但是很原始。
  • Schalk Versteeg 添加为编辑:XSDtoClasses code.google.com/p/xsd-to-classes - Extendable VS plugin, very similar in capabilities to XSD2Code.
  • XSD2Code 不适用于 Visual Studio 2012。
【解决方案2】:

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

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

【讨论】:

  • 不要太担心它是一个“死项目”。如果它非常完整并且可以正常工作,那么它不会“死”-它可以正常工作!到目前为止对我来说还可以
  • 我目前正在一个活动项目中成功使用 Linq to Xsd。它似乎是我发现的最“完整”的 xsd 到类映射器。我尝试使用 Xsd2Code,但它没有很好地映射 xsd 的复杂类型 - 我有一个 xs:pattern 限制,它在 Linq 中完美地映射到 Xsd,但在 Xsd2Code 中缺失。重要提示 - 下载 Linq to Xsd 的源代码 - 它有一大堆文档和示例项目,它们未在 codeplex 的“文档”选项卡中列出 - download here
  • 我已经用了几年了。与其他实体技术相比,它具有一些巨大的优势,我认为 MS 放弃它真的很可惜
  • 不适用于 Visual Studio 2012。
  • 还在用! (不适用于新东西,但它仍然适用于 .NET Core)。
【解决方案3】:

开源项目XSD to Classes 非常适合我。

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • 网站不可用了,你的回答也没有用。
          猜你喜欢
          • 2010-09-22
          • 2013-05-22
          • 1970-01-01
          • 1970-01-01
          • 2011-08-04
          • 1970-01-01
          • 2020-01-23
          • 1970-01-01
          • 2011-03-24
          相关资源
          最近更新 更多