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

2023-11-23

我正在对从 xsd 架构文件生成代码进行一些研究。 我的要求:

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

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

我找到了以下选项:

  1. 使用 xsd.exe(随 SDK 和 Visual Studio 提供)
  2. XSDCodeGen 来自丹尼尔·卡祖里诺
  3. Xsd2Code
  4. CodeXS
  5. Xsd对象生成器由微软
  6. 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

根据需要执行以下步骤来整理生成的代码:

  1. 正则表达式替换 - 当前项目、案例、整个单词 -[System.Runtime.Serialization.DataContractAttribute(名称:b=:b:q,:b命名空间:b=:b*{:q})] 与 [DataContract(Namespace = \1)]**
  2. 替换 - 当前项目、案例、整个单词 -[System.Runtime.Serialization.DataMemberAttribute()] with [数据成员]
  3. 正则表达式替换 - 当前项目、案例、整个单词 -System.Nullable with \1?
  4. 正则表达式替换 - 打开文档、案例、整个单词 -{:w}TYPE with \1
  5. 替换 - 打开文档、案例、整个单词 -系统日期时间 with DateTime,然后添加缺少的 using 语句
  6. 替换 - 打开文档、案例、整个单词 -[System.Xml.Serialization.XmlIgnoreAttribute()] with [Xml忽略]
  7. 替换 - 当前项目 -System.Xml.Serialization.XmlArrayAttribute with XmlArray
  8. 替换 - 当前项目 -System.Xml.Serialization.XmlArrayItemAttribute with XmlArrayItem
  9. 正则表达式替换 - 当前项目 -,[:Wh]+/// with ,
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • JavaScript 检查文件大小

    是否可以继续使用 javascript 检查网络服务器上文件的文件大小 例如http www mysite com myfile js 大于 0 字节 如果是 则返回 true 或 false 值 提前致谢 理论上 您可以使用 XHR 发出
  • Jackson 中不区分大小写的 JsonNode

    我需要反序列化 JSON 对象并以不区分大小写的方式访问字段 例子 String s FOO 123 ObjectMapper mapper new ObjectMapper JsonNode node mapper readTree s
  • 编译gdb进行远程调试

    我正在尝试远程调试在arm9上运行的应用程序 到目前为止 我已经能够在我的设备上交叉编译和执行 gdbserver 获取 gdb 7 2 源代码并提取它们 configure target arm none linux gnueabi wi
  • python matplotlib 热图颜色条从透明

    如何实现这样的python matplotlib heatmap colorbar plt imshow a aspect auto cmap plt cm gist rainbow r plt colorbar matplotlib 库中
  • 当奇数宽度的 div 被分割 50%/50% 时,剩余的 1px 会发生什么?

    假设我想为以下内容制作背景div wrapper这样使用两个 div 一半是蓝色 一半是红色width 50 像这样 HTML div div div div div div CSS body html wrapper width 100
  • 使用 Flex/Bison 的解释器 REPL

    我已经为类 C 语言编写了一个解释器 使用 Flex 和 Bison 作为扫描器 解析器 执行完整的程序文件时它工作正常 现在我正在尝试在解释器中实现 REPL 以供交互式使用 我希望它像 Ruby 或 ML 中的命令行解释器一样工作 显示
  • AutoFac:注入 NULL 值

    我想使用 AutoFac 将当前主体注入需要它的对象中 假设我有一个对象 AuthorizationValidator 正在执行安全检查 它看起来像这样 public AuthorizationValidator IAuthorizatio
  • 是否可以通过JNI将静态库链接到Java?

    是否可以构建 HelloWorld lib 并使用 JNI 将其加载到 Java 应用程序 或者它只适用于共享库 我在 JNI 文档中找不到明确的答案 没有提到 静态库 它需要是一个动态库 幸运的是 您可以从静态库构建动态库
  • 安置新问题

    In this 我需要 C 数组类模板 它是固定大小的 基于堆栈的并且不需要默认构造函数我发布了一段代码 即使用带有 char 数组的放置 new 对我来说 这是绝对正常的事情 但根据评论 这段代码是错误的 谁能更详细地解释一下吗 具体来说
  • 有没有一种方法可以更新一个功能文件中的标头并使用 Karate.config.js 中的身份验证令牌?

    我想仅在一个功能文件中更新我的通用标头 Accept 和 Content Type 但是 我想使用已在 Karate config cs 文件中配置的授权令牌 你能帮我解决这个问题吗 文档对此进行了详细解释 https github com
  • 以编程方式确定 Cisco VPN 客户端是否已连接

    我正在使用基本的 Cisco VPN 客户端 我相信是 v 5 无论如何 是否可以以编程方式确定特定配置文件 或与此相关的任何配置文件 是否已连接 我希望以某种方式从客户本身获得状态 我不想尝试 ping VPN 另一端的某个 IP 才能查
  • PHP 中 ord 或 charCodeAt() 的 UTF-8 安全等效项

    我需要能够使用 ord 来获取与 javascript 的 charCodeAt 函数相同的值 问题是 ord 不支持 UTF8 如何在 PHP 中将 转换为 260 我尝试过一些 uniord 函数 但它们都报告 256 而不是 260
  • 有人知道如何在记事本++中使用正则表达式查找阿拉伯字符吗?

    我正在尝试使用 Notepad CTRL F 和正则表达式来检测网页 HTML 中的阿拉伯字符 我输入以下内容作为我的搜索词 它返回所有字符 u0600 u06FF 我正在使用的随机文本示例块 awr4tgagas qa4tq4tw q4t
  • 如何在 JBoss AS 7 中部署 war 文件?

    我下载了 JBoss Application Server 5 并成功部署了一个 war 文件 我将具有简单 index jsp 文件的 Hello war 复制粘贴到 jboss 5 1 0 GA jdk6 jboss 5 1 0 GA
  • React Native Module AppRegistry 不是已注册的可调用模块

    我在处理我们团队正在开发的共享 github 项目时遇到问题 我已经为这个问题苦苦挣扎了大约一周 但没有任何运气 问题是在我团队的计算机上运行的全新克隆无法在我的计算机上正常运行 它抛出错误 Module AppRegistry 不是可调用
  • 滑动手势在全屏模式下的 YouTubePlayerView 中不起作用

    我正在使用YouTube API 我想应用Swipe左右手势开启YouTubePlayerView在全屏模式下 The Swipe手势不起作用Android4 0 版本时YouTubePlayerView处于全屏模式 请在这件事上给予我帮助
  • 处理 UNPIVOT 中的 NULL 值

    我可以对表进行逆透视 但结果中不包含空值 create table pivot task age int null a numeric 8 2 b numeric 8 2 c numeric 8 2 d numeric 8 2 e nume
  • 如何让鼠标冻结c#

    我希望鼠标按下时冻结 无法移动 谢谢 我使用了一个tableLayoutPanel供您参考 只需记住将代码实现到前面的Control即可 选项1 重置鼠标位置 定义两个全局变量 bool mousemove true Point curre
  • 如何使用可变模板来展平类型树?

    我有一个这样的构造 template
  • XSD 代码生成器的比较 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在对从 xsd 架构文件生成代码进行一些研究 我的要求 必须生成 C 2 0 代码 或更高版本 并在需要时使用泛型集合 必须从 xsd 注释生成