C# 中的 XML 到强类型转换






4.80/5 (80投票s)
2005 年 8 月 14 日
7分钟阅读

229663
演示如何使用 Xsd.exe 工具和 XML 在 C# 中创建强类型。
引言
我最近在一家知名的技术出版物网站上阅读了一些文章,偶然看到一篇文章,介绍了如何从 XML 文档中获取强类型的 C# 类型。由于我之前已经做过几次,所以我想看看是否能从中获取一些有用的信息,比如额外的 XSD 注释。总之,在对这篇文章感到失望后(正如我确信你们中的一些人在阅读这篇文章后也会感到失望一样),我开始在网上搜索如何从 XML 生成强类型的 .NET 类型,但我发现很难找到简短明了的内容,所以我想尝试一下。
文章目标 |
描述强类型语言和非强类型语言之间的主要区别。 |
概述强类型。 |
概述 Xsd.exe 工具。 |
演示如何使用 Xsd.exe 从 XML 文件创建 XSD。 |
演示如何使用 Xsd.exe 从 XSD 创建 C#.NET 类文件。 |
演示如何使用 Xsd.exe 从 XSD 创建强类型的 DataSet 。 |
首先,语言强类型是什么意思?解释强类型和非强类型语言之间区别的最简单方法是比较它们通常如何处理拼写错误。如果你在非强类型语言中有一个名为 myVar
的变量,并在代码中第二次引用它时写成 myVat
,代码会编译通过,你很可能会在运行时测试中发现这个错误(myVar
拼写错误为 myVat
)。另一方面,如果你在 C#.NET 中有同样的拼写错误,代码将无法编译,你将在设计时发现这个错误。
强类型语言的另一个好处是你知道指针的底层 类型(尽管它们有时可能是语言支持的最通用类型,在 C#.NET 中是 object
)。例如,以下 C#.NET 代码将无法编译,因为该语言是强类型的,编译器知道 Hashtable
和 string
之间的区别。
Hashtable hash = new Hashtable();
string someString = hash;
旁栏: JavaScript 和 VBScript 等脚本语言不是强类型的,几乎所有内容都是 variant
或可以包含任何其他类型的类型。
XML 文件
本文中的示例将使用最基本的 XML 文件之一。实际上,与 Xsd.exe 工具一起使用的 XML 文件甚至不需要文件头中的 XML 描述符。我们的 XML 文件名为 People.xml,内容如下:
<People>
<Person>
<FirstName>Mike</FirstName>
<LastName>Elliott</LastName>
<City>Dallas</City>
<State>TX</State>
<Company>Play For Sport, Inc.</Company>
</Person>
</People>
Xsd.exe 工具是什么?
Visual Studio .NET 帮助文件对 Xsd.exe 的描述如下: XML Schema Definition 工具 (Xsd.exe) 与 .NET Framework 工具一起作为 .NET Framework SDK 的一部分安装。该工具有两个主要目的:
- 生成符合特定 XML Schema 定义语言 (XSD) 架构的 C# 或 Visual Basic 类文件。该工具将 XML Schema 作为参数,并输出一个包含多个类的文件,当使用
XmlSerializer
序列化时,这些类将符合该架构。 - 从 .dll 文件或 .exe 文件生成 XML Schema 文档。如果你需要查看你创建的或已用属性修改过的文件集的架构,请将 DLL 或 EXE 作为参数传递给该工具以生成 XML 架构。
在我的机器上,Xsd.exe 可以在 [InstallDrive]:\Program Files\Microsoft Visual Studio .NET [2003]\SDK\[v1.1]\bin 目录中找到。该实用程序的默认输出源语言是 C#,正如本文前面所说,我们将重点关注如何处理我们的 People.xml 文件,生成 XSD,并使用该 XSD 生成标准的 C# 类,最后是强类型的 DataSet
。
旁栏: 我喜欢将常用的命令行工具复制到 [WinRoot]\System32 目录,以便从任何目录直接访问它们。打开命令提示符并键入 xsd.exe /?
,以查看该工具的所有命令和开关选项。
从 XML 文件创建 XSD
好的,为了确保我提供所有细节;我创建了一个 C:\_A\XmlToTypes 目录,其中(暂时)只包含 People.xml 文件。
要从我们的 People.xml 文件生成 XSD,请执行以下操作:
- 打开命令提示符。
- 在命令提示符下,切换到包含 People.xml 文件的目录(在我机器上是 C:\_A\XmlToTypes)。
- 在命令提示符下键入:
xsd.exe People.xml
这将生成一个 People.xsd 文件。图 1 显示了命令行的输入和输出。
Figure 1
C:\_A\XmlToTypes>xsd.exe People.xml
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 1.1.4322.573]
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
Writing file 'C:\_A\XmlToTypes\People.xsd'.
图 2 显示了 People.xsd 的内容。
Figure 2
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="People" xmlns=""
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="People" msdata:IsDataSet="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="Person">
<xs:complexType>
<xs:sequence>
<xs:element name="FirstName"
type="xs:string" minOccurs="0" />
<xs:element name="LastName"
type="xs:string" minOccurs="0" />
<xs:element name="City"
type="xs:string" minOccurs="0" />
<xs:element name="State"
type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
从 XSD 创建 C# 类
为了生成 C# 类或强类型的 DataSet
,我们必须有一个 XSD。幸运的是,Xsd.exe 已经通过我们的 XML 文件为我们创建了一个。
要从我们的 People.xsd 生成 C#.NET 类,请执行以下操作:
- 打开命令提示符。
- 在命令提示符下,切换到包含 People.xsd 文件的目录(在我机器上是 C:\_A\XmlToTypes)。
- 在命令提示符下键入:
xsd.exe People.xsd /c
这将生成一个 People.cs 文件。图 3 显示了命令行的输入和输出。
Figure 3
C:\_A\XmlToTypes>xsd.exe People.xsd /c
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 1.1.4322.573]
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
Writing file 'C:\_A\XmlToTypes\People.cs'.
图 4 显示了 People.cs 的内容。请注意,Xsd.exe 代码生成器创建了一个名为 People
的 C# 类,以及另一个名为 PeoplePerson
的类。
Figure 4
//------------------------------------------------
// <autogenerated>
// This code was generated by a tool.
// Runtime Version: 1.1.4322.2032
//
// Changes to this file may cause incorrect
// behavior and will be lost if the code is
// regenerated.
// </autogenerated>
//------------------------------------------------
//
// This source code was auto-generated by xsd,
// Version=1.1.4322.2032.
//
using System.Xml.Serialization;
/// <remarks/>
[System.Xml.Serialization.XmlRootAttribute(Namespace="",
IsNullable=false)]
public class People {
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Person",
Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public PeoplePerson[] Items;
}
/// <remarks/>
public class PeoplePerson {
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(
Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string FirstName;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(
Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string LastName;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(
Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string City;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(
Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string State;
}
旁栏: 进行任何必要的代码更改,例如添加或更改命名空间或类名(有一个额外的命令行开关可用于让代码生成器添加正确的命名空间:/namespace
)。只需将 .cs 文件添加到你的 Visual Studio .NET 项目中,即可开始使用。
创建强类型的 DataSet 从 XSD
首先我想说,Xsd.exe 工具不是我创建强类型 DataSet
的首选方式,但我想提供一点多样性。我更喜欢创建一个 C# Windows 应用程序并使用向导来创建强类型的 DataSet
。我选择这样做是因为我可以有一个单一的、独立的应用程序负责生成与项目相关的所有强类型 DataSet
,并将其添加到源代码管理中。此外,如果我的数据库架构发生变化,我可以简单地打开项目,删除 DataSet
,然后立即创建一个最新的 DataSet
。
要从我们的 People.xsd 文件生成强类型的 DataSet
,请执行以下操作:
- 将你刚刚创建的现有 People.cs 文件重命名为 People1.cs(这很重要,否则它将被覆盖)。
- 打开命令提示符。
- 在命令提示符下,切换到包含 People.xsd 文件的目录(在我机器上是 C:\_A\XmlToTypes)。
- 在命令提示符下键入:
xsd.exe People.xsd /d
这将生成一个名为 People.cs 的 .cs 文件。图 5 显示了命令行的输入和输出。
Figure 5
C:\_A\XmlToTypes>xsd.exe People.xsd /d
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 1.1.4322.573]
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
Writing file 'C:\_A\XmlToTypes\People.cs'.
旁栏: 生成的 People.cs 文件内容太长,无法在此处包含,但如果你打开它,你会发现一个名为 People
的 C# 类,它派生自 DataSet
。代码生成器还会创建与 XSD 中的元素相关的几个有用的方法和属性。
摘要
我希望我做得不错,让这些信息简短而切题。我希望你们也能看到,从 XML 开始创建强类型是多么容易。Xsd.exe 代码生成实用程序非常有用。可以将你通常存储在 XML 文件中的静态配置和其他结构轻松转换为强类型,并转化为运行时对象。另一个很酷的好处是,IntelliSense 可用于这些类型,这应该会减少开发时间,因为拼写和引用问题将在设计时被捕获。
历史
- 2005 年 8 月 14 日
- 版本 1.0.0.0 - 首次发布文章。