适用于 VS 2005/2008 的 XML Schema Reader Writer 插件






4.43/5 (5投票s)
基于 Schema 的 XML 读取器/写入器,实现为 .NET COM 生成器
引言
本文介绍了一个 Visual Studio 插件(适用于 VS 2005/2008),该插件提供 XML schema (XSD) 与 Visual Studio IDE 的更广泛协作,并将 .NET XSD 支持公开给 Microsoft CLR 不支持的语言。 简而言之,组装此插件是使用作为 Microsoft Windows SDK 一部分的 xsd.exe 实用程序、.NET CodeDom 和一些 COM 知识演变而来的。
CodeProject 上发表了几篇关于 XSD.exe 工具及其各种用法的文章,例如 Serialization.aspx。
我的插件使用 xsd.exe 工具来创建描述 XSD 文件的代理类。 生成的“普通”代理类可用于读取 XML 对象的写入和读取,并根据 schema 验证数据。 所有这些都不需要使用太多代码。
问题
首先,从 xsd.exe 生成的代码远非 .NET 优化,也没有集成到 Visual Studio 中。 为了生成 XML 代理代码,应该退出 VS,使用预定义的 XML schema 执行 xsd.exe,重新进入 VS,将代理代码添加到项目中。(这只能是 .NET 语言,不包括 C++。)
读取和验证数据需要创建 XML 序列化器对象、XmlReader
,将 XmlReader
配置为 schema 类型,加载 schema(与我们最初创建对象时使用的 schema 相同!!!)。
总而言之,一遍又一遍地做这件事,尤其是在 schema 快速变化时,听起来很累。 诚然,Visual Studio 有时会在将 schema 文件拖到 .NET 项目时自行创建代理类,但 schema 更改又该怎么办呢?
底线是 - Visual Studio 本身并没有与 xsd.exe 紧密合作。
想法
很久以前我就发现了 xsd.exe 的强大功能和潜力,但总是有 Visual Studio 兼容性的借口、我上面描述的“艰苦”工作以及 .NET 对它的排他性也是避免它的原因。 但是,如果代理类是 COM 公开的呢? 如果它们有 COM 接口呢? 将 .NET 的强大功能用于本机 C++ 等语言会多么酷? 如果写入、读取和验证过程是代理代码的一部分呢?
Visual Studio 的一个插件可以完成所有这些事情,那将是很棒的……
解决方案
我首先编写了代码,该代码将为每个 xsd.exe 代理类型(我称之为原始类型)自动生成并行的 COM 类/枚举,并为每个需要使用 System.CodeDom
命名空间的类生成相应的 COM 接口,以便动态生成代码并解析来自 xsd.exe 的原始代码,这是使用 SharpDevelop 的 NRefactory
库完成的。
我构建的每个新类都可以转换为原始代理类型以进行写入。 读取数据时会发生相反的过程。 完成动态编码后,代码经过编译即可使用,并且更加简单。
使用插件
安装插件后(包含安装项目),启动 Visual Studio 并加载包含一个或多个有效 XSD(XML schema)文件的项目。

向导执行完毕后,会将一个文件夹添加到项目中,其中包含向导的输出
- 一个 .NET 类库文件包含读取/写入代码。
- 类库的 XML 文档文件。
- 一个 readme 文件包含 .NET 库文件 GUID (
LIBID
)、Factory
类和接口的 GUID,用于创建所有需要的组件。

用法示例

为了验证你正在读取的数据,请使用工厂的 CreateReader
方法的另一个重载,并提供你自己的验证器类实例。
要求
- Visual Studio 2005 或 2008
- Windows SDK
历史
- 2009 年 4 月 17 日:首次发布