我相信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
根据需要执行以下步骤来整理生成的代码:
- 正则表达式-当前项目,大小写,整个单词- [System.Runtime.Serialization.DataContractAttribute(Name:b * =:b *:q,:b命名空间:b =:b * {:q})]用[DataContract(命名空间= \ 1)]
- 用[DataMember]替换-当前项目,案例,整个单词- [System.Runtime.Serialization.DataMemberAttribute()]
- 正则表达式替换-当前项目,大小写,整个单词-System.Nullable \ <{:w}>用\ 1 \?
- 正则表达式替换-打开文档,大小写,整个单词- {:w} TYPE为\ 1
- 替换-打开的文档,案例,整个单词- System.DateTime的有日期时间,然后添加缺少using语句
- 用[XmlIgnore]替换-打开文档,大小写,整个单词- [System.Xml.Serialization.XmlIgnoreAttribute()]
- 替换-当前项目- System.Xml.Serialization.XmlArrayAttribute与XmlArray
- 替换-当前项目- System.Xml.Serialization.XmlArrayItemAttribute与XmlArrayItem
- 正则表达式替换-当前的项目- ,[:WH] + /// \ <辞/ \>用,
希望能对某人有所帮助。