我正在对从 xsd 架构文件生成代码进行一些研究。
我的要求:
- 必须生成 C# 2.0 代码(或更高版本),并在需要时使用泛型集合。
- 必须从 xsd 注释生成注释
- 必须生成完全可序列化的代码。
- 当从具有相同包含的多个 xsd 生成时,应该能够生成可重用的基本类型。
(另请参阅我的其他问题:如何从具有常见包含的 xsd 生成多个类? and 如何从 wsdl 中的 xs:documentation 标记生成注释?
我找到了以下选项:
- 使用 xsd.exe(随 SDK 和 Visual Studio 提供)
- XSDCodeGen 来自丹尼尔·卡祖里诺
- Xsd2Code
- CodeXS
-
Xsd对象生成器由微软
-
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 到 XSD - Very cool项目,但不是我想要的
附录:如果您确实决定继续使用 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(名称:b=:b:q,:b命名空间:b=:b*{:q})] 与 [DataContract(Namespace = \1)]**
- 替换 - 当前项目、案例、整个单词 -[System.Runtime.Serialization.DataMemberAttribute()] with [数据成员]
- 正则表达式替换 - 当前项目、案例、整个单词 -System.Nullable with \1?
- 正则表达式替换 - 打开文档、案例、整个单词 -{:w}TYPE with \1
- 替换 - 打开文档、案例、整个单词 -系统日期时间 with DateTime,然后添加缺少的 using 语句
- 替换 - 打开文档、案例、整个单词 -[System.Xml.Serialization.XmlIgnoreAttribute()] with [Xml忽略]
- 替换 - 当前项目 -System.Xml.Serialization.XmlArrayAttribute with XmlArray
- 替换 - 当前项目 -System.Xml.Serialization.XmlArrayItemAttribute with XmlArrayItem
- 正则表达式替换 - 当前项目 -,[:Wh]+/// with ,
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)