XSD代码生成器的比较[关闭]


76

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

  • 必须在需要的地方使用通用集合生成C#2.0代码(或更高版本)。
  • 必须从xsd注释生成注释
  • 必须生成完全可序列化的代码。
  • 从具有相同include的多个xsd生成时,应该能够生成可恢复的基本类型。

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

我发现以下选项:

  1. 使用xsd.exe(SDK和Visual Studio随附)
  2. Daniel Cazzulino的XSDCodeGen
  3. Xsd2Code
  4. CodeXS
  5. XsdObjectGen由Microsoft
  6. XSDClassGen(似乎缺少作用)

我有想念吗?因为(1),(2)和(5)不会生成2.0代码,并且我在序列化(3)中的代码时遇到问题。生成代码时使用什么?


您对Xsd2Code遇到什么问题?我没有任何问题。
约翰·卡夫

5)stackoverflow.com/questions/607085/…具有指向源的2.0 XSDObjectGen链接
Greg Domjan 09年

Answers:


62

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

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

我们的主要驱动因素是xsd.exe不会从XSD注释生成XML doc,而由于我们拥有数百种类型定义,因此我们希望这样做。我尝试了上面列出的所有工具以及其他工具,其中大多数工具已被弃用,未维护或无法与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命名空间:b =:b * {:q})]用[DataContract(命名空间= \ 1)]
  2. [DataMember]替换-当前项目,案例,整个单词- [System.Runtime.Serialization.DataMemberAttribute()]
  3. 正则表达式替换-当前项目,大小写,整个单词-System.Nullable \ <{:w}>\ 1 \?
  4. 正则表达式替换-打开文档,大小写,整个单词- {:w} TYPE\ 1
  5. 替换-打开的文档,案例,整个单词- System.DateTime的日期时间,然后添加缺少using语句
  6. [XmlIgnore]替换-打开文档,大小写,整个单词- [System.Xml.Serialization.XmlIgnoreAttribute()]
  7. 替换-当前项目- System.Xml.Serialization.XmlArrayAttributeXmlArray
  8. 替换-当前项目- System.Xml.Serialization.XmlArrayItemAttributeXmlArrayItem
  9. 正则表达式替换-当前的项目- ,[:WH] + /// \ <辞/ \>

希望能对某人有所帮助。


2
我必须同意Xsd2Code当前是冠军。如果您手动或通过GPO移动了默认的“文档”位置,只需注意加载项未正确加载。解决方案是从安装位置获取加载项文件,并将其放置在Documents \ Visual Studio 2010 \ Addins \文件夹中。
斯蒂芬·帕滕

1
xsd2code似乎已死。我希望即将推出新版本,这里有一个主要的阻塞性错误,以及另外两个错误,它们使我们无法实际使用此错误。
womp 2011年

请注意:我在Nuget上遇到了XsdClassGen(请参见 nuget.org/List/Packages/XsdClassGen)。它使用了一个T4模板,虽然很好,但是非常原始。
devuxer 2011年

2
通过添加Schalk Versteeg作为编辑:XSDtoClasses code.google.com/p/xsd-to-classes -Extendable VS plugin, very similar in capabilities to XSD2Code.
InfantPro'Aravind”

3
XSD2Code并不适用于Visual Studio 2012的工作
cederlof

9

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

我要试一试。带有XSD生成的LINQ会比您提到的任何这些工具都要好-只要它能很好地工作。


5
不要太在意它的“死项目”。如果它几乎完整并且可以正常工作,那么它就不会“死”-它可以正常工作!到目前为止对我来说还不错
Simon_Weaver

2
我目前在一个活跃的项目中成功使用Linq to Xsd。它似乎是我发现的最“完整”的xsd到类映射器。我尝试使用Xsd2Code,但它无法很好地映射xsd的复杂类型-我有一个xs:pattern限制,该限制在Linq中完美地映射到Xsd,但在Xsd2Code中却没有。最高提示-将Linq的源代码下载到Xsd-它具有大量未在codeplex的“文档”标签中列出的文档和示例项目-在此处下载
-Lanceomagnifico

3
我已经使用了几年了。与其他实体技术相比,它具有一些巨大的优势,我认为MS放弃了它真是太可惜了
Simon_Weaver

不适用于Visual Studio2012。–
cederlof

仍在使用它!(不适用于新内容,但仍可在.NET Core下使用)。
Simon_Weaver


2

一年多以前,我在一个项目中使用了CodeXS。经过一些小的调整(一个脚本,稍微清理了所生成的代码),它发挥了作用。

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



0

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

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

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


-2

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


该网站不再可用,您的回答也没有用。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.