DataSet 的内容可以从 XML 流或文档创建

11 篇文章 0 订阅

ADO.NET DataSet 的内容可以从 XML 流或文档创建。此外,利用 .NET 框架,您可以相当灵活地控制从 XML 中加载哪些信息以及如何创建 DataSet 的架构(即关系结构)。

若要使用 XML 中的数据填充 DataSet,请使用 DataSet 对象的 ReadXml 方法。该 ReadXml 方法将从文件、流或 XmlReader 中进行读取,并将 XML 的源以及可选的 XmlReadMode 参数用作参数。(有关 XmlReader 的更多信息,请参阅用 XmlTextReader 读取 XML 数据。)该 ReadXml 方法读取 XML 流或文档的内容并将数据加载到 DataSet 中。根据所指定的 XmlReadMode 和关系架构是否已存在,它还将创建 DataSet 的关系架构。

下表描述 XmlReadMode 参数的选项。

XmlReadMode说明
Auto这是默认值。检查 XML 并按如下顺序选择最适合的选项:
  • 如果 XML 为 DiffGram,则使用 DiffGram
  • 如果 DataSet 包含架构或 XML 包含内联架构,则使用 ReadSchema
  • 如果 DataSet 不包含架构且 XML 不包含内联架构,则使用 InferSchema

如果所读取的 XML 格式已知,为了获得最佳性能,建议设置显式 XmlReadMode 而不是采用默认选项 Auto

ReadSchema读取内联架构并加载数据和架构。

如果 DataSet 已包含架构,则新表将从内联架构添加到 DataSet 中的现有架构。如果 DataSet 中已存在内联架构中的任何表,则将引发异常。您将无法使用 XmlReadMode.ReadSchema 来修改现有表的架构。

如果 DataSet 不包含架构并且没有内联架构,则不读取任何数据。

内联架构可以使用 XML 架构定义语言 (XSD) 架构来定义。有关以 XML 架构形式编写内联架构的详细信息,请参阅从 XML 架构 (XSD) 生成 DataSet 关系结构

IgnoreSchema忽略任何内联架构并将数据加载到现有的 DataSet 架构中。任何与现有架构不匹配的数据都将被丢弃。如果 DataSet 中不存在任何架构,则不会加载任何数据。

如果数据为 DiffGram,则 IgnoreSchemaDiffGram 具有相同的功能。

InferSchema忽略任何内联架构并按照 XML 数据的结构推断架构,然后加载数据。

如果 DataSet 已包含架构,则当前架构将通过添加新表(如果不存在现有表)或通过向现有表中添加列来进行扩展。如果已存在具有不同命名空间的推断表或者任何推断表与现有列发生冲突,则会引发异常。

有关 ReadXmlSchema 如何从 XML 文档推断架构的详细信息,请参阅从 XML 推断 DataSet 关系结构

DiffGram读取 DiffGram 并将数据添加到当前架构中。DiffGram 会将新行和其中唯一标识符值匹配的现有行合并。请参阅本主题末尾的对“合并 XML 中的数据”的说明。有关 DiffGram 的更多信息,请参阅 DiffGram
Fragment持续读取多个 XML 片断,直至到达流的末尾。与 DataSet 架构匹配的片断会追加到相应的表。与 DataSet 架构不匹配的片断将被丢弃。

注意 如果将 XmlReader 传递到未完全放入 XML 文档的 ReadXml 中,ReadXml 将读取至下一个元素节点并将其当作根元素,这种读取仅持续到元素节点末尾。这在指定 XmlReadMode.Fragment 时不适用。

DTD 实体

如果 XML 包含在文档类型定义 (DTD) 架构中定义的实体,那么当试图通过向 ReadXml 传递文件名、流或非验证 XmlReader 来加载 DataSet 时,将引发异常。因此,您必须在将 EntityHandling 设置为 EntityHandling.ExpandEntities 的情况下创建一个 XmlValidatingReader,然后将该 XmlValidatingReader 传递到 ReadXml。该 XmlValidatingReader 将在被 DataSet 读取之前扩展实体。

以下代码示例显示如何从 XML 流中加载 DataSet。第一个示例显示向 ReadXml 方法传递的文件名。第二个示例显示一个字符串,它包含使用 System.IO.StringReader 加载的 XML。

Dim myDS As DataSet = New DataSet
myDS.ReadXml("input.xml", XmlReadMode.ReadSchema)

DataSet myDS = new DataSet();
myDS.ReadXml("input.xml", XmlReadMode.ReadSchema);

Dim myDS As DataSet = New DataSet
Dim myTable As DataTable = New DataTable("table1")
myTable.Columns.Add("col1", Type.GetType("System.String"))
myDS.Tables.Add(myTable)

Dim xmlData As String = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>"

Dim xmlSR As System.IO.StringReader = New System.IO.StringReader(xmlData)

myDS.ReadXml(xmlSR, XmlReadMode.IgnoreSchema)

DataSet myDS = new DataSet();
DataTable myTable = new DataTable("table1");
myTable.Columns.Add("col1", typeof(string));
myDS.Tables.Add(myTable);

string xmlData = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>";

System.IO.StringReader xmlSR = new System.IO.StringReader(xmlData);

myDS.ReadXml(xmlSR, XmlReadMode.IgnoreSchema);

合并 XML 中的数据

如果 DataSet 已经包含数据,则会向已存在于 DataSet 中的数据添加 XML 中的新数据。ReadXml 不会从 XML 向 DataSet 中并入任何具有匹配主键的行信息。若要使用 XML 中的新信息改写现有行信息,请使用 ReadXml 创建一个新的 DataSet,然后使用 Merge 将新 DataSet 并入现有 DataSet。请注意,如果使用 XmlReadModeDiffGramReadXML 来加载 DiffGram,则将合并具有相同唯一标识符的行。

XmlTextReader 类是 XmlReader 的实现,它提供快速的,性能优良的分析器。它强制 XML 必须采用正确格式的规则。由于它既没有 DTD 信息,也没有架构信息,因此它既不是验证分析器也不是非验证分析器。它可以读取块中的文本或从流中读取字符。

XmlTextReader 提供了下列功能:

  • 强制 XML 必须采用正确格式的规则。
  • 检查 DTD 的格式是否正确。然而,并不将 DTD 用于验证、扩展实体引用或添加默认属性。
  • 不针对 DTD 或架构进行验证。
  • 检查任何 DOCTYPE 节点的格式是否正确。
  • 检查实体的格式是否正确。对于 EntityReference 节点类型,返回单个空 EntityReference 节点。空 EntityReference 节点是 Value 属性为 string.Empty 的节点。这是因为您没有用来扩展实体引用的 DTD 或架构。XmlTextReader 确保整个 DTD(包括 EntityReference 节点)格式正确。
  • 提供性能优良的 XML 分析器,原因是 XmlTextReader 没有涉及验证检查的系统开销。

XmlTextReader 可以从不同输入(如流对象、 TextReader 类 对象以及标识本地文件位置或 Web 站点的 URL)读取数据。

XmlTextReader 使用 XmlResolver 检查 DTD 的格式是否正确。有关 XmlResolver 的更多信息,请参阅 解析由 URI 指定的外部 XML 资源 。

编码声明 <?xml version="1.0" encoding="ISO-8859-5"?> 包含设置文档的编码的编码属性。XmlTextReader 有一个 Encoding 属性,它返回在 XML 声明中的编码属性中找到的字符编码。如果未找到编码属性,则文档的默认值将设置为 UTF-8。

如果读取了外部资源(例如用于扩展实体引用或架构文件的 DTD),则编码将设置为在外部引用中找到的编码值。如果在外部引用中没有找到编码,则默认值设置为 UTF-8。XmlTextReader 支持许多编码,这是由于它使用 System.Text.Encoding Class 。因此,该类支持的所有编码也受 XmlTextReader 支持。唯一不支持的编码是将 <?xml 序列映射到 UTF-8 以外的不同字节值(如 UTF-7 和 EBCDIC)的编码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值