我正在从xsd模式文件中进行代码生成方面的一些研究.我的要求:
必须使用通用集合生成C#2.0代码(或更高版本).
必须从xsd注释生成注释
必须生成完全可序列化的代码.
当从具有相同包含的多个xsd生成时,应该能够生成可恢复的基本类型.
(另请参阅我的其他问题:如何使用常见包含从xsd生成多个类?以及如何从wsdl中的xs:documentation标记生成注释?
我找到了以下选项:
使用xsd.exe(随SDK和Visual Studio提供)
来自Daniel Cazzulino的 XSDCodeGen
Xsd2Code
CodeXS
XsdObjectGen由Microsoft提供
XSDClassGen(似乎在行动中缺失)
我错过了吗?因为(1),(2)和(5)不生成2.0代码,并且我在从(3)序列化代码时遇到问题.生成代码时你会用什么?
我相信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
根据需要执行以下步骤以整理生成的代码:
正则表达式替换 - 当前项目,大小写,整个单词 - [System.Runtime.Serialization.DataContractAttribute(Name:b*=:b*:q,:b 命名空间:b =:b*{:q})]和[DataContract(命名空间=\1)]
替换 - 当前项目,案例,整个单词 - [System.Runtime.Serialization.DataMemberAttribute()]与[DataMember]
正则表达式替换 - 当前项目,大小写,整个单词 - System.Nullable\<{:w}>与\ 1 \?
正则表达式替换 - 打开文档,大小写,整个单词 - {:w} TYPE with \ 1
替换 - 打开文档,大小写,整个单词 - 使用DateTime的System.DateTime,然后添加缺少的using语句
替换 - 使用[XmlIgnore]打开文档,大小写,整个单词 - [System.Xml.Serialization.XmlIgnoreAttribute()]
替换 - 当前项目 - 带有XmlArray的System.Xml.Serialization.XmlArrayAttribute
替换 - 当前项目 - 带有XmlArrayItem的System.Xml.Serialization.XmlArrayItemAttribute
正则表达式替换 - 当前项目 - ,[:Wh] + ///\
希望能帮助别人.
我还没有检查过,但Linq2XSD可能是一个有用的选择.
我打算给这个人一个机会.使用XSD生成的LINQ将优于您提到的任何这些工具 - 只要它工作得很好.