我相信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 Namespace:b =:b*{:q})] 与 [DataContract(命名空间 = \1)]
- 用[DataMember]替换 - 当前项目、案例、整个单词 - [System.Runtime.Serialization.DataMemberAttribute() ]
- 正则表达式替换 - 当前项目、案例、整个单词 - System.Nullable\<{:w}>与\1\?
- 正则表达式替换 - 打开文档、大小写、整个单词 - {:w}TYPE与\1
- 替换 - 打开文档、案例、整个单词 - System.DateTime与DateTime,然后添加缺少的 using 语句
- 替换 - 打开文档、案例、整个单词 - [System.Xml.Serialization.XmlIgnoreAttribute()]与[XmlIgnore]
- 用XmlArray替换 - 当前项目 - System.Xml.Serialization.XmlArrayAttribute
- 用XmlArrayItem替换 - 当前项目 - System.Xml.Serialization.XmlArrayItemAttribute
- 正则表达式替换 - 当前项目 - ,[:Wh]+/// \<remarks/\>为,
希望对某人有所帮助。