XML與DataSet進(jìn)行交互是非常容易的,無(wú)論是XML文件還是XML字符串。而我們現在主要用的都是XML字符串的方式。即使用DataSet.GetXml()方式。
</Table>
好,現在開(kāi)始講解Schema。我們可以通過(guò)DataSet.GetXmlSchema()來(lái)得到DataSet的Schema。當然,該方法還是用來(lái)生成String這符串的。我們首先來(lái)看一下它的格式。
假如有如下表:
表Test,其字段描述如下:
ID(string) Name(string) time(DateTime)
1 aa 2004-5-1
2 bb
其DataSet的Xml格式如下:
<?xml version=”1.0″ encoding=”utf-16″?>
<xs:schema id=”NewDataSet” xmlns=”" xmlns:xs=”http://www.w3.org/2001/XMLSchema” xmlns:msdata=”urn:schemas-microsoft-com:xml-msdata”>
<xs:element name=”NewDataSet” msdata:IsDataSet=”true” msdata:Locale=”zh-CN”>
<xs:complexType>
<xs:choice maxOccurs=”unbounded”>
<xs:element name=”test”>
<xs:complexType>
<xs:sequence>
<xs:element name=”ID” type=”xs:string” minOccurs=”0″ />
<xs:element name=”Name” type=”xs:string” minOccurs=”0″ />
<xs:element name=”time” type=”xs:dateTime” minOccurs=”0″ />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
至于Schema的寫(xiě)法,我就不多說(shuō)了,不清楚的朋友可以找一本Xml的基礎資料來(lái)看一下。這里我們重點(diǎn)要看紅色標注的一行,里屬性type就是用來(lái)表示在Xml中該字段的數據類(lèi)型。其它屬性還包含字段的限制等等。實(shí)際上,XmlSchema的作用就在于此。同時(shí),即便在Xml中字段為空時(shí)不顯示,通過(guò)XmlSchema也可以得到完整的數據字段。還有一點(diǎn),就是表名,你同時(shí)也可以看到在XmlSchema中有與Xml中對應的表名,這里看到的為test。
好,講到這里,我想你已經(jīng)大概了解DataSet轉為Xml的一些基礎知識了。那么現在我再來(lái)講一下Xml還原成DataSet的方法。
DataSet已經(jīng)很好的支持了Xml。這一點(diǎn)我在開(kāi)發(fā)過(guò)程中感受得非常深刻。DataSet通過(guò)客戶(hù)端是不能夠提取的,因此我先轉成Xml,然后通過(guò)客戶(hù)端的MSXML進(jìn)行DOM解析,真的是非常棒哦。有空你也可以試一下它的強大功能。
Xml轉成DataSet主要用DataSet.ReadXmlSchema()和DataSet.ReadXml()方法。注意這里,我們通過(guò)DataSet獲取時(shí),如果要獲取Schame,那么寫(xiě)一定要先將DataSet.ReadXmlSchema()寫(xiě)在前面,因為DataSet只有首先得到數據架構,才能在架構中添加數據哦(想想建筑師們是怎么設計的吧)!
如果XML數據是DiffGram,那么就用DiffGram格式推導數據。如果XML文檔包含內聯(lián)架構,那么這個(gè)架構就用于確定DataSet對象的子元素的結構。這種行為等于ReadSchema選項。如果沒(méi)有找到架構,那么就用InferXMLSchema方法從DataSet對象推導架構信息。如果載加載DataSet對象時(shí)設置一個(gè)明確的XmlReadMode方法,那么就可以改進(jìn)性能。
在DataSet.GetXml()方法中,會(huì )有第二個(gè)參數是用來(lái)設置Get方法。里面最有作用的就是DiffGram參數。它可以完整保存DataSet中的信息。加入該參數,你再觀(guān)察一下DataSet生成的Xml,會(huì )發(fā)現從獲取DataSet到對DataSet的記錄操作變更全部都記錄在Xml中了,這就是DiffGram的功勞。這樣,即便我們把DataSet以Xml的方法傳遞到任何其它層,都可以進(jìn)行有效的更新或還原了。
DiffGram格式
DiffGram是一種XML序列化格式,它包括每一行的原始值和當前值。特別地,它包含帶有原始值的行列表以及將所有更改組織在一起的最后一節。每一行都由一個(gè)為已標示符,用于兩節DiffGram之間跟蹤改變。下面的清單描述了DiffGram的結構,其中第一行被刪除,第三行被修改并且插入了一個(gè)新行:
<diffgr:diffgram>
<DataSetName>
<Employees diffgr:id=”Employees1″ msdata:rowOrder=”0″>…</Employees>
<Employees diffgr:id=”Employees3″ msdata:rowOrder=”2″>…</Employees>
<Employees diffgr:id=”Employees4″ msdata:rowOrder=”3″ diffgr:hasChanges=”modified”>…</Employees>
<Employees diffgr:id=”Employees5″ msdata:rowOrder=”4″>…</Employees>
<Employees diffgr:id=”Employees6″ msdata:rowOrder=”5″>…</Employees>
<Employees diffgr:id=”Employees7″ msdata:rowOrder=”6″>…</Employees>
<Employees diffgr:id=”Employees8″ msdata:rowOrder=”7″>…</Employees>
<Employees diffgr:id=”Employees9″ msdata:rowOrder=”8″>…</Employees>
<Employees diffgr:id=”Employees10″ msdata:rowOrder=”9″ diffgr:hasChanges=”inserted”>…</Employees>
</DataSetName>
<diffgr:before>
<Employees diffgr:id=”Employees2″ msdata:rowOrder=”1″>…</Employees>
<Employees diffgr:id=”Employees4″ msdata:rowOrder=”3″>…</Employees>
</diffgr:before>
</diffgr:diffgram>
<diffgr:diffgram>根節點(diǎn)友兩個(gè)子節點(diǎn)。第一個(gè)是帶有其當前內容的DataSet對象,包括新添加的行和修改的行,但是不包括刪除的行。這種數據樹(shù)根據DataSet對象命名。用DataSetName屬性的到和設置DataSet對象名。第二個(gè)節點(diǎn)是以<diffgr:before>節點(diǎn)為根的樹(shù)。這個(gè)樹(shù)包含恢復DataSet對象原始狀態(tài)的足夠信息。例如,它仍然包含所有被刪除的行和所有被修改行的原始內容。受改變影響的所有列都在<diffgr:before>子樹(shù)種跟蹤。
標示行
diffgr:id屬性用于在當前行和原始行之間建立鏈接。diffgr:hasChanges屬性可以很快找到那些紀錄被刪除、插入或者只是修改。
你可以用另外兩個(gè)屬性來(lái)控制所保存的XML格式。第一個(gè)是DataColumn對象的ColumnMapping屬性,它可以指定WriteXml方法是否隱藏了列,是將列寫(xiě)成一個(gè)元素、一個(gè)屬性還是簡(jiǎn)單的文本。另一個(gè)你應該注意的屬性就是DataRelation對象的Nested屬性。當我們用WriteXml來(lái)寫(xiě)父子關(guān)系中子表里的記錄時(shí),該屬性可以指定這些記錄是否是嵌套在相關(guān)的父表記錄中的。
注意:在試圖從一個(gè)XML DiffGram創(chuàng )建DataSet對象時(shí),要保證目標DataSet對象有與所讀取得DataSet對象有同樣的架構。不能將DiffGram裝入一個(gè)空的新創(chuàng )建的DataSet對象。
聯(lián)系客服