科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道[冷枫]ADO.NET 中的 XML 特性

[冷枫]ADO.NET 中的 XML 特性

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

ADO.NET 中的 XML 特性

作者:冷枫 来源:CSDN 2007年9月24日

关键字: 冷枫 ADO XML

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

毫无疑问,XML 及其一些相关技术(包括 XPathXSL TransformationXML Schema)是 ADO.NET 的基础。与 ADO 相比,ADO.NET 对象模型的互操作性得到很大的提高,而事实上,XML 正是为此发挥重要作用的关键元素。在 ADO 中,XML 只是一个用于保留断开连接的记录集的内容的(非默认)I/O 格式。而 XML 在 ADO.NET 的构建和交互方面的参与则深入得多。可以用以下几点来概括 ADO.NET 与 XML 的更强的交互和集成:

对象序列化和远程处理

双编程接口

XML 驱动的批处理更新(仅适用于 SQL Server 2000)

在 ADO.NET 中,您可以用若干种方法将对象保存到 XML 文档以及从 XML 文档还原对象。总之,这种能力只属于 DataSet 对象,但可以用最少的代码扩展到其他容器对象。将诸如 DataTableDataView 这样的对象保存到 XML 实质上可视为数据集序列化的特殊情况。

此外,ADO.NET 和 XML 类提供了一种统一的中间 API,程序员可通过同步的双编程接口来使用它。您可以使用 XML 基于节点的分层法或基于列的表格式数据集关系法来访问和更新数据。您可以在任何时候从数据的数据集表示形式切换到 XML DOM,反之亦然。数据将进行同步,而且您在其中一个模型中输入的任何更改会立即在另一个模型中有所反映,并可以看见。在本文中,我将讨论 ADO.NET 到 XML 的序列化和 XML 数据访问,也就是上面列表中的前两点。下个月,我将主要讨论 XML 驱动的批处理更新 — 您从 SQL Server 2000 XML Extensions (SQLXML 2.0) 获得的最酷特性之一。

*

数据集和 XML

就像任何其他 .NET 对象一样,DataSet 对象以二进制格式存储在内存中。不过,与其他对象不同的是,数据集始终以一种名为 DiffGram 的特殊XML 格式来进行远程处理和序列化。当数据集进入应用程序域的边界或计算机的物理边界时,会自动呈现为 DiffGram。在目标端,无提示地重新构建数据集为二进制对象,并可以立即使用。应用程序可以通过一组方法来使用同样的序列化功能,其中的一对方法显然非常突出。它们是 ReadXmlWriteXml。下表显示了您可以用来在读写中使用 XML 的数据集的方法。

GetXml

返回一个字符串,该字符串是数据集中存储的数据的 XML 表示形式

不包括任何架构信息

GetXmlSchema

返回一个字符串,该字符串是数据集的 XML 架构信息

ReadXml

使用从流或文件读取的指定 XML 数据填充 DataSet 对象

ReadXmlSchema

将指定的 XML 架构信息加载到当前的 DataSet 对象

WriteXml

写入表示数据集的 XML 数据(或架构)

可以写入流或文件

WriteXmlSchema

写入字符串,该字符串是数据集的 XML 架构信息

可以写入流或文件

正如上表所示,使用 DataSet 和 XML 时,您可以将数据和架构信息作为不同的实体进行管理。您可以接受来自数据集的 XML 架构,将它作为字符串使用。您也可以将它写入磁盘文件或将它加载到一个空的 DataSet 对象。与上表中列出的方法可以相提并论的是,DataSet 对象还包含两个与 XML 相关的属性 — NamespacePrefixNamespace 确定将 XML 属性和元素读取到数据集时用于限定其范围的 XML 命名空间。作为命名空间别名的前缀存储在 Prefix 属性中。

 

从 XML 构建数据集

ReadXml 方法填充从多个源读取的 DataSet 对象,这些源包括磁盘文件、.NET 流或 XmlReader 对象的实例。该方法可以处理任何类型的 XML 文件,但是,如果 XML 文件具有构形相当不规则的非表格式结构,则在以列和行的格式呈现时,当然可能产生一些问题。

ReadXml 方法有几个重载,所有这些重载都十分类似。它们接受 XML 源以及可选的作为参数的 XmlReadMode 值。例如:

public XmlReadMode ReadXml(String, XmlReadMode);

该方法根据指定的读模式以及数据集中是否已存在架构来为数据集创建关系架构。下面的代码片段显示了用于从 XML 加载数据集的典型代码。

StreamReader sr = new StreamReader(fileName);DataSet ds = new DataSet();ds.ReadXml(sr);   // defaults to XmlReadMode.Autosr.Close();

将 XML 源的内容加载到数据集时,ReadXml 不合并其主键信息相匹配的行。要将现有的数据集与从 XML 加载的数据集合并,首先必须创建一个新的数据集,然后使用 Merge 方法合并这两个数据集。在合并期间,所要覆盖的行就是那些具有相匹配的主键的行。您也可以使用另一种方法将现有的 DataSet 对象与从 XML 读取的内容进行合并,即通过 DiffGram 格式(稍后将详细讨论)。

下表解释了 ReadXml 支持的多个读模式。您可以使用 XmlReadMode 枚举对它们进行设置。

IgnoreSchema

忽略任何嵌入式架构,而依靠数据集的现有架构

ReadSchema

读取任何嵌入式架构,并加载数据和架构

InferSchema

忽略任何嵌入式架构,并从 XML 数据推断架构

DiffGram

读取 DiffGram,并将数据添加到当前架构

Fragment

读取和添加 XML 片段,一直到流的结尾

默认的读模式没有在表中列出,这就是 XmlReadMode.Auto。设置此模式时,或者尚未显式设置任何读模式时,ReadXml 方法将检查 XML 源并选择最适合的选项。

如果发现 XML 源是 DiffGram,则将源作为 DiffGram 加载。如果源正好包含嵌入式架构或对外部架构的引用,将使用 ReadXmlSchema 来加载源。最后,如果 XML 源中不存在任何架构信息,则 ReadXml 方法使用数据集的 InferXmlSchema 方法推断架构。数据集的关系结构(即架构)由表、列、约束和关系组成。下面我们来看看设置其中的每一种模式时会发生什么情况。

XmlReadMode.IgnoreSchema 选项将使该方法忽略任何嵌入式架构或引用的架构。因此,该数据被加载到现有的数据集架构,而不适合的任何数据将被放弃。如果数据集中不存在架构,则不加载任何数据。注意,空的数据集没有架构信息。记住,如果 XML 源是 DiffGram 格式的,则 IgnoreSchema 选项的效果与 XmlReadMode.DiffGram 一样。

// no schema in the DataSet, no data will be loadedDataSet ds = new DataSet();StreamReader sr = new StreamReader(fileName);ds.ReadXml(sr, XmlReadMode.IgnoreSchema);

XmlReadMode.ReadSchema 选项只对嵌入式架构有效,而不识别外部引用。它可以向数据集添加新表,但如果数据集中已存在在嵌入式架构中定义的任何表,则将引发异常。您不能使用 ReadSchema 选项来更改一个现有表的架构。如果数据集不包含架构(也就是说,数据集是空的),并且没有嵌入式架构,则不读取和加载任何数据。ReadXml 只能读取使用 XML 架构定义语言 (XSD) 或 XML-Data Reduced (XDR) 定义的嵌入式架构。不支持任何文档类型定义 (DTD)。

如果设置了 XmlReadMode.InferSchema 选项,ReadXml 将直接从 XML 数据的结构推断架构,并忽略可能存在的任何嵌入式架构。只有在推断出架构后,才加载数据。通过根据情况来添加新表或向现有的表添加新列可扩展现有的架构。您可以使用数据集的 InferXmlSchema 方法将架构从指定的 XML 文件加载到数据集。在某种程度上,您可以控制在架构推断操作过程中处理的 XML 元素。利用方法 InferXmlSchema 的签名,您可以指定一组其元素将从推断中排除的命名空间。

void InferXmlSchema(String fileName, String[] rgNamespace);

DiffGram 是 ADO.NET 用于保存数据集状态的 XML 格式。与 SQLXML 的 updategram 格式类似的是,DiffGram 同时包括数据行的当前状态和原始状态。使用 ReadXml 加载 DiffGram 时,将合并具有相匹配的主键的行。您可以使用 XmlReadMode.DiffGram 标志显式指示 ReadXml 对 DiffGram 生效。使用 DiffGram 格式时,目标数据集必须具有与 DiffGram 相同的架构,否则,合并操作将失败,并会引发异常。

如果设置了 XmlReadMode.Fragment 选项,将从 XML 片段加载数据集。XML 片段是一段有效的 XML,它标识元素、属性和文档。元素的 XML 片段是完全限定 XML 元素(节点、CDATA、处理指令、注释)的标记文本。属性的片段是属性值,文档的片段则是整个内容集合。如果 XML 数据是一个片段,则不应用完整格式的 XML 文档的根级别规则。与现有的架构相匹配的片段被追加到适当的表,不匹配架构的片段将被放弃。ReadXml 从当前位置读到流的结尾。XmlReadMode.Fragment 选项不应该用于填充一个空的而且缺少架构的数据集。

    • 评论
    • 分享微博
    • 分享邮件
    闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣椤愪粙鏌ㄩ悢鍝勑㈤柣顓燁殜楠炴牕菐椤掆偓婵¤偐绱掗幇顓ф疁闁哄矉绻濆畷鍫曞煛娴i攱鐫忛梻浣告惈椤戝懘鏌婇敐澶婅摕闁哄浄绱曢悿鈧柣搴秵娴滅偞绂掗悙顒傜瘈婵炲牆鐏濋悘鐘绘煏閸喐鍊愮€殿喖顭峰鎾晬閸曨厽婢戦梺璇插嚱缂嶅棙绂嶉弽顓炵;闁规崘顕ч崘鈧銈嗘尪閸斿海绮欒箛娑欌拺閻犳亽鍔屽▍鎰版煙閸戙倖瀚�

    濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴濐潟閳ь剙鍊圭粋鎺斺偓锝庝簽閸旓箑顪冮妶鍡楀潑闁稿鎹囬弻娑㈡偄闁垮浠撮梺绯曟杹閸嬫挸顪冮妶鍡楀潑闁稿鎸剧槐鎾愁吋閸滃啳鍚Δ鐘靛仜閸燁偉鐏掗柣鐘叉穿鐏忔瑧绮i悙鐑樷拺鐟滅増甯掓禍浼存煕閹惧娲撮柟顔藉劤鐓ゆい蹇撴噳閹锋椽姊婚崒姘卞闁告娲熷畷濂稿Ψ閵壯勭叄婵犵數濮撮敃銈団偓姘煎弮瀹曪綀绠涢弮鍌滅槇婵犵數濮撮崐缁樻櫠濞戙垺鐓曢悗锝冨妼婵′粙鏌曢崶褍顏€殿喕绮欐俊姝岊槹闁逞屽墯鐢繝寮婚悢鍏煎癄濠㈣泛锕ュ▓濠氭⒑閸濆嫮鐏遍柛鐘崇墵楠炲啫饪伴崼婵堝幐闂佺ǹ鏈粙鎾广亹鐎n喗鐓熼幖娣€ゅḿ鎰箾閸欏顏堟偩濠靛牏鐭欓悹鎭掑妽濞堥箖姊洪崜鎻掍簼婵炲弶鐗犻幃鈥斥槈閵忥紕鍘遍柣蹇曞仜婢т粙鎯岀€n偆绠鹃柛顐ゅ枑閸婃劖鎱ㄦ繝鍕笡闁瑰嘲鎳愮划鐢碘偓锝庝簼閻d即姊绘担瑙勫仩闁告柨顑夊畷锟犲礃閼碱剚娈鹃梺闈涚箞閸婃洟宕橀埀顒€顪冮妶鍡楀闁稿骸宕惃顒勬⒒閸屾瑧鍔嶉悗绗涘懐鐭欓柟瀵稿Л閸嬫挸顫濋悡搴$睄閻庤娲戦崡鍐茬暦閸楃倣鐔兼⒐閹邦喚娉块梻鍌欑窔濞佳囨偋閸℃稑绠犻幖娣灪閸欏繑銇勯幒鍡椾壕闂佸疇顫夐崹鍧楀春閵夆晛骞㈡俊鐐插⒔閸戣绻濋悽闈浶為柛銊︽そ閺佸鏌ч懡銈呬沪濞e洤锕俊鍫曞川椤斿吋顏¢梻浣呵归鍛村磹閸︻厽宕叉繛鎴欏灩楠炪垺淇婇婵愬殭缁炬澘绉归弻锝嗘償閵忥絽顥濆銈忓閺佽顕g拠宸悑闁割偒鍋呴鍥⒒娴e憡鍟為柟鎼佺畺瀹曠増鎯旈…鎴炴櫔闂佹寧绻傞ˇ浠嬪极閸℃ぜ鈧帒顫濋濠傚闂佹椿鍘介〃鍡欐崲濞戙垹绠婚柡澶嬪灩閸斾即姊虹粙娆惧剱闁圭懓娲濠氭晲閸涱亝顫嶅┑鐐叉閸旀洜澹曢幎鑺モ拺闁告繂瀚﹢鎵磼鐎n偄鐏撮柛鈺冨仱楠炲鏁冮埀顒€顔忓┑鍥ヤ簻闁哄洨鍋為崳娲煃鐠囪鍔熺紒杈ㄦ崌瀹曟帒鈻庨幋婵嗩瀴婵$偑鍊戦崝宀勫箠濮椻偓楠炲棗鐣濋崟顐わ紲闂佺粯鍔欏ḿ褏绮婇敃鍌涚厵闁稿繗鍋愰弳姗€鏌涢弬璺ㄧ劯闁诡喚鍋ゅ畷褰掝敃閻樿京鐩庨梻浣告贡閸庛倝宕归悽鍓叉晜闁冲搫鎳忛崐鍨叏濮楀棗澧绘俊鎻掔秺閺屾洟宕惰椤忣厾鈧鍠曠划娆愪繆濮濆矈妲奸梺闈╃祷閸庡磭妲愰幘瀛樺缂佹稑顑呭▓顓炩攽閳藉棗浜濈紒璇茬墕椤曪絾绻濆顓炰簻缂佺偓濯芥ご鎼佸疾閿濆鍋℃繝濠傚暟鏁堥梺璇″枟閿曘垽骞婇悩娲绘晢闁稿本绮g槐鏌ユ⒑閸濆嫷妲搁柣妤€瀚板畷婵囨償閿濆洣绗夐梺缁樺姉閸庛倝鎮″☉銏″€堕柣鎰硾琚氶梺鍝ュУ閿曘垽寮婚埄鍐╁闁荤喐婢橀~鎺楁倵鐟欏嫭绀堥柛鐘崇墵閵嗕礁顫滈埀顒勫箖閳哄懏鎯炴い鎰╁€濋幏濠氭⒒閸屾艾鈧嘲霉閸パ呮殾闁割煈鍋呴崣蹇涙煙閹澘袚闁抽攱姊婚埀顒€绠嶉崕閬嵥囬鐐插瀭闁稿瞼鍋為悡銏′繆椤栨粌鐨戠紒杈ㄥ哺閺屻劌鈹戦崱鈺傂︾紓浣插亾閻庯綆鍋佹禍婊堟煛瀹ュ啫濡块柍钘夘槹缁绘盯宕奸悢铏圭厜濠殿喖锕ㄥ▍锝呪槈閻㈢ǹ宸濇い鏂惧嫎閳ь剚鍔曢—鍐Χ鎼粹€茬凹濠电偠灏欓崰鏍х暦濞差亜鐒垫い鎺嶉檷娴滄粓鏌熼崫鍕棞濞存粓绠栧娲箰鎼淬垻鈹涙繝纰樷偓铏悙閸楅亶鏌熼悧鍫熺凡缂侇偄绉归弻娑㈩敃閿濆洨鐣煎銈嗘尰濡炶棄顫忛搹鍦<婵☆垰鎼~宀勬倵濞堝灝娅橀柛鎾寸懆閻忓啴姊洪崨濠佺繁闁哥姵宀稿畷銏ゅ箹娴e厜鎷洪梺鍛婃尰瑜板啯绂嶆禒瀣厱閻庯綆浜滈顓㈡煙椤旀枻鑰块柡浣稿暣瀹曟帒鈽夊顒€绠為梻浣筋嚙閸戠晫绱為崱娑樼;闁糕剝蓱濞呯姵銇勯幒鎴濃偓鑽ゅ婵傚憡鐓曢悘鐐插⒔閳藉绱掑锕€娲﹂悡娆撴煟閻斿憡绶叉い蹇e弮閺岀喖鎮℃惔銏g闂佺懓寮堕幐鍐茬暦閻斿吋顥堟繛鎴炵懄閻濓繝姊婚崒姘偓鎼佸磹妞嬪海鐭嗗〒姘e亾妤犵偞鐗犻、鏇㈠Χ閸屾矮澹曞┑顔矫畷顒勫储鐎电硶鍋撶憴鍕缂傚秴锕濠氬幢濡ゅ﹤鎮戦梺鍛婁緱閸ㄧ晫妲愰柆宥嗙厽閹艰揪绱曢悾顓㈡煕鎼淬劋鎲鹃挊婵喢归崗鍏肩稇缁炬崘娉曢埀顒€绠嶉崕閬嵥囨导瀛樺亗闁哄洢鍨洪悡娑㈡煕閵夛絽鍔氬┑锛勫帶椤儻顧侀柛銊ゅ嵆濠€渚€姊虹紒妯撳湱绮旈鈧、鏃堝醇閻旇櫣鏆㈤梻鍌氬€烽悞锔锯偓绗涘懏宕查柛灞绢嚤濞戞鏃堝川椤撶姴骞掗梻浣告惈濞层垽宕瑰ú顏呭亗闁告劦浜濋崰鎰節婵犲倻澧曠紒鈧崼鐔稿弿婵☆垱瀵х涵楣冩煢閸愵亜鏋涢柡灞炬礃缁绘稖顦查悗姘卞厴瀹曟垿濡搁埡鍌楁嫼缂傚倷鐒﹂敋濠殿喖娲﹂妵鍕即閵娿儱绫嶉梺绯曟杺閸ㄨ棄顕i幘顔碱潊闁炽儲鏋奸崑鎾绘偨閸涘﹦鍙嗗┑鐘绘涧濡鍩€椤掑倹鍤€闁宠绉瑰畷鍫曞Ω閿濆嫮鐩庨梻濠庡亜濞诧妇绮欓幇鏉跨疅濡わ絽鍟悡娑㈡倶閻愰潧浜剧紒鈧€n兘鍋撶憴鍕濞存粌鐖奸妴浣割潨閳ь剟骞冮姀锛勯檮濠㈣泛顦辨径锟�

    重磅专题
    往期文章
    最新文章