怎样用XML技术对数据库进行操作

众所周知,XML文件是保存和传输数据的载体,数据库自然也可以用XML进行读取。那么怎样使用XML技术呢?Microsoft.Net提供了XmlDataDocument类来专门来操作数据库。

 

XmlD

ataDocument是XmlDocument的一个子类,它可以去读取和操作数据库或Xml文件中的数据,它使用的是W3C Document Object(DOM)。DOM用带有层次的节点来描述数据。由于它实现了IxpathNavigable接口,所以它又可以被XslTransform使用。由于XmlDataDocument和DataSet有密切的联系,任何对XmlDataDocument的改动将映射到相应的DataSet上,反之亦然。

下面我们用一个例子来说明怎样将一个DataSet输出到一个Xml文件中去。

WriteTo.cs

None.gif using  System;
None.gif
None.gif
using  System.Data;
None.gif
None.gif
using  System.Xml;
None.gif
None.gif
using  System.Data.SqlClient;
None.gif
None.gif
None.gif
public   class  WriteTo
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif
public static void Main()
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
InBlock.gifDataSet ds 
= new DataSet();// 新建一个DataSet,也可以使用已存在的数据库。
InBlock.gif

InBlock.gifDataTable dt 
= new DataTable("product");//新建一个表。
InBlock.gif

InBlock.gifDataColumn dc1 
= new DataColumn("Id",System.Type.GetType("System.Int32"));
InBlock.gif
InBlock.gifDataColumn dc2 
= new DataColumn("ProductName",System.Type.GetType("System.String"));
InBlock.gif
InBlock.gifdt.Columns.Add(dc1);
InBlock.gif
InBlock.gifdt.Columns.Add(dc2);
InBlock.gif
InBlock.gif
for(int i=1;i<5;i++)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
InBlock.gifDataRow dr 
= dt.NewRow();
InBlock.gif
InBlock.gifdr[
"Id"= i;
InBlock.gif
InBlock.gifdr[
"ProductName"= "Product"+i.ToString();
InBlock.gif
InBlock.gifdt.Rows.Add(dr);
InBlock.gif
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gifds.Tables.Add(dt);
InBlock.gif
InBlock.gif
InBlock.gif
//Load the document with the DataSet.
InBlock.gif

InBlock.gifXmlDataDocument doc 
= new XmlDataDocument(ds); 
InBlock.gif
InBlock.gif
InBlock.gif
//Write data to a file.
InBlock.gif

InBlock.gifXmlTextWriter writer 
= new XmlTextWriter(Console.Out);//这时我们将结果输出到Dos下以方便调试,也可以输出到一个XML文件中。
InBlock.gif

InBlock.gifwriter.Formatting 
= Formatting.Indented;//输出格式。
InBlock.gif

InBlock.gifdoc.WriteTo(writer); 
InBlock.gif
InBlock.gifdoc.WriteContentTo(writer);
InBlock.gif
ExpandedSubBlockEnd.gif}

InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif


运行这个程序,我们发现结果如下:

None.gif < NewDataSet >
None.gif
None.gif
< product >
None.gif
None.gif
< Id > 1 </ Id >
None.gif
None.gif
< ProductName > Product1 </ ProductName >
None.gif
None.gif
</ product >
None.gif
None.gif
< product >
None.gif
None.gif
< Id > 2 </ Id >
None.gif
None.gif
< ProductName > Product2 </ ProductName >
None.gif
None.gif
</ product >
None.gif
None.gif
< product >
None.gif
None.gif
< Id > 3 </ Id >
None.gif
None.gif
< ProductName > Product3 </ ProductName >
None.gif
None.gif
</ product >
None.gif
None.gif
< product >
None.gif
None.gif
< Id > 4 </ Id >
None.gif
None.gif
< ProductName > Product4 </ ProductName >
None.gif
None.gif
</ product >
None.gif
None.gif
</ NewDataSet >
None.gif
None.gif
< NewDataSet >
None.gif
None.gif
< product >
None.gif
None.gif
< Id > 1 </ Id >
None.gif
None.gif
< ProductName > Product1 </ ProductName >
None.gif
None.gif
</ product >
None.gif
None.gif
< product >
None.gif
None.gif
< Id > 2 </ Id >
None.gif
None.gif
< ProductName > Product2 </ ProductName >
None.gif
None.gif
</ product >
None.gif
None.gif
< product >
None.gif
None.gif
< Id > 3 </ Id >
None.gif
None.gif
< ProductName > Product3 </ ProductName >
None.gif
None.gif
</ product >
None.gif
None.gif
< product >
None.gif
None.gif
< Id > 4 </ Id >
None.gif
None.gif
< ProductName > Product4 </ ProductName >
None.gif
None.gif
</ product >
None.gif
None.gif
</ NewDataSet >
None.gif
None.gif

我们可以看到一个数据库成功的输出成一个XML文件格式。

有了XmlDataDocument这个类,我们可以很轻松的对一个数据库进行操作,并且我们对XmlDataDocument所做的操作都会映射到数据库中去。

比如我们对一个XML文件操作(这个XML文件是DataSet产生的),相应的改变也会导致DataSet的改变。

下面我们以一个实例来说明这一点,需说明的一点是,这个实例还使用了XSD进行校验,以确保数据库传输和操作的正确性。

Store.xsd:

None.gif < xsd:schema  xmlns:xsd ="http://www.w3.org/2001/XMLSchema" >
None.gif
None.gif
< xsd:element  name ="bookstore"  type ="bookstoreType" />
None.gif
None.gif
< xsd:complexType  name ="bookstoreType" >
None.gif
None.gif
< xsd:sequence  maxOccurs ="unbounded" >
None.gif
None.gif
< xsd:element  name ="book"  type ="bookType" />
None.gif
None.gif
</ xsd:sequence >
None.gif
None.gif
</ xsd:complexType >
None.gif
None.gif
None.gif
< xsd:complexType  name ="bookType" >
None.gif
None.gif
< xsd:sequence >
None.gif
None.gif
< xsd:element  name ="title"  type ="xsd:string" />
None.gif
None.gif
< xsd:element  name ="author"  type ="authorName" />
None.gif
None.gif
< xsd:element  name ="price"  type ="xsd:decimal" />
None.gif
None.gif
</ xsd:sequence >
None.gif
None.gif
< xsd:attribute  name ="genre"  type ="xsd:string" />
None.gif
None.gif
</ xsd:complexType >
None.gif
None.gif
None.gif
< xsd:complexType  name ="authorName" >
None.gif
None.gif
< xsd:sequence >
None.gif
None.gif
< xsd:element  name ="first-name"  type ="xsd:string" />
None.gif
None.gif
< xsd:element  name ="last-name"  type ="xsd:string" />
None.gif
None.gif
</ xsd:sequence >
None.gif
None.gif
</ xsd:complexType >
None.gif
None.gif
</ xsd:schema >
None.gif
None.gif

我们可以发现这个XSD文件控制的XML文件的格式,它定义了三个元素:title,author和price。

对应的DataSet.xml如下:

None.gif <!-- sample XML fragment -->
None.gif
None.gif
< bookstore >
None.gif
None.gif
< book  genre ='novel'  ISBN ='10-861003-324'>
None.gif
None.gif
<title > The Handmaid's Tale </ title >
None.gif
None.gif
< price > 19.95 </ price >
None.gif
None.gif
</ book >
None.gif
None.gif
< book  genre ='novel'  ISBN ='1-861001-57-5'>
None.gif
None.gif
<title > Pride And Prejudice </ title >
None.gif
None.gif
< price > 24.95 </ price >
None.gif
None.gif
</ book >
None.gif
None.gif
</ bookstore >
None.gif
None.gif

这个Xml文件可以向上例那样通过XmlDataDocument产生,数据库名是:bookstore,表名是book,column名是title和price,genre和ISBN也是当做column来处理。

针对这个Xml文件我们可以进行操作。

ExpandedBlockStart.gif ContractedBlock.gif /**/ /**
InBlock.gif
InBlock.gif* System.Xml/XmlDataDocument class
InBlock.gif
InBlock.gif* Author: wenjun
InBlock.gif
ExpandedBlockEnd.gif
*/

None.gif
None.gif
using  System;
None.gif
None.gif
using  System.Data;
None.gif
None.gif
using  System.Xml;
None.gif
None.gif
public   class  GetRowFromElement
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif
public static void Main() 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
InBlock.gifXmlDataDocument doc 
= new XmlDataDocument(); 
InBlock.gif
InBlock.gifdoc.DataSet.ReadXmlSchema(
"store.xsd");
InBlock.gif
InBlock.gifdoc.Load(
"dataset.xml");
InBlock.gif
InBlock.gif
//Change the price on the first book.
InBlock.gif

InBlock.gifXmlElement root 
= doc.DocumentElement;
InBlock.gif
InBlock.gifDataRow row 
= doc.GetRowFromElement((XmlElement)root.FirstChild);
InBlock.gif
InBlock.gifrow[
"price"= "18.95";//将第一column中的price值改掉
InBlock.gif

InBlock.gifConsole.WriteLine(
"Display the modified XML datadot.gif");
InBlock.gif
InBlock.gifConsole.WriteLine(doc.DocumentElement.OuterXml);
InBlock.gif
ExpandedSubBlockEnd.gif}

InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif

运行这个程序,发现输出如下:

Display the modified XML data...

 

None.gif < bookstore >< book  genre ="novel"  ISBN ="10-861003-324" >< title > The Handmaid's Tale </ title >< price > 18.95 </ price ></ book >< book  genre ="novel"  ISBN ="1-861001-57-5" >< title > Pride And Prejudice </ title >< price > 24.95 </ price ></ book ></ bookstore >

 

我们可以发现price的值已改了过来。我们可以在查找相应数据库(bookstore),发现里面的值也跟着改了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值