一. 本文程序設計和運行的軟件環境:?
1.微軟公司視窗2000服務器版?
2..net framework sdk beta 2?
二. c#創建xml文檔:?
在本文中我們來介紹一下用c#創建xml文檔的二種方法,這二種方法各有千秋,第一種創建起來更靈活,第二種創建起來更方便。?
1.c#創建xml文檔的第一種方法:?
這一種方法是按照按照xml的結構一步一步的構建xml文檔。c#構建xml文檔通過.net framework sdk中的命名空間"system.xml"中封裝的各種類來實現的。下面就按照一個xml典型文檔結構來介紹一下。?
??? ◇首先要創建一個空的xml文檔:?
在命名空間"system.xml"中有一個類"xmldocument",c#通過這個類來描述xml文檔。下面是用c#創建一個xml文檔。?
xmldoc = new system.xml.xmldocument ( ) ;? |
◇在xml的文檔的最頭部加入xml的聲明段落:?
利用"xmldocument"類中的 "createnode" 方法可以創建一個指定類型的xml節點,"createnode" 方法的調用方法總共有三種,在本文中使用的其一般的方法,具體語法如下:?
xmldocument.createnode method ( xmlnodetype , string , string )? |
然后在利用"xmldocument"類中的"appendchild"方法在xml文檔中加入此節點,用c#在xml文檔中加入聲明段落實現的語句如下:?
xmlnode = xmldoc.createnode ( xmlnodetype.xmldeclaration , "" , "" ) ; xmldoc.appendchild ( xmlnode ) ; |
◇為xml文檔加入元素(element):?
加入數據內容是通過元素,在"xmldocument"類中提供了二個方法:"createelement"和"createtextnode"。其中第一個方法是在xml中創建一個元素,另外一個方法是為創建的元素指定文本值。下面是為上面創建的xml文檔加入一個根元素。?
xmlelem = xmldoc.createelement ( "" , "root" , "" ) ; xmltext = xmldoc.createtextnode ( "root text" ) ; |
注釋:其中"xmlelem"是創建的"xmlelement"對象,"xmltext"是"xmltext"對象?
有了創建一個xml元素的例子,就可以根據xml文檔中數據的不同的結構來創建其他的數據了。?
??? 2.c#創建xml文檔的第一種方法的源程序代碼(no1.cs):?
using system ; using system.xml ; class mainclass { xmldocument xmldoc ; xmlnode xmlnode ; xmlelement xmlelem ; xmlelement xmlelem2 ; xmltext xmltext ;
static void main ( string [ ] args )
{
{ |
???
3.c#創建xml文檔的第二種方法:?
??? 在介紹完第一種方法以后,我想每一個讀者都感覺到用c#創建xml文檔是一項比較煩雜的工作了,因為不僅要了解創建的知識,還要了解文檔的結構,這樣創建的過程就是一步一步的了。下面就來介紹一種比較容易的創建方法,這種創建方法是直接定義xml文檔,然后把他保存到文件中就可以了。?
??? ◇創建一個xml文檔:?
??? 這一點和第一種方法一樣,在這里就不介紹了。?
◇通過"xmldocument"類中的"loadxml"方法,直接在文檔中加入想要加入的xml數據。當然你加入的xml應該符合xml的語法,不然產生的文件也沒有什么意義了。下面是加入xml的具體代碼:?
doc.loadxml (? "<employees> " + "<no1>" + "<name>ma jin hu</name>" + "<zip> 239000 </zip>" + "<address>feng huang street</address>" + "<city>chu zhou city</city>" + "<state> anhui </state>" + "</no1>" + "<no2>" + "<name>wang tian</name>" + "<zip> 239000 </zip>" + "<address>lang ya street</address>" + "<city>he fei city</city>" + "<state> anhui </state>" + "</no2>" + "<no3>" + "<name>zou wen biao</name>" + "<zip> 100000 </zip>" + "<address>sai di street</address>" + "<city>bei jin city</city>" + "<state>bei jin</state>" + "</no3>" + "</employees>" ) ;? |
把保存xml文檔到文件中:?
保存xml文檔是通過"xmldocument"類中的"save"方法來實現的。具體如下:?
doc.save ( "data.xml" ) ;? |
◇c#創建xml文檔的第二種方法的源程序代碼(no2.cs):?
using system ; using system.io ; using system.xml; public class sample { public static void main ( ) { //創建一個xmldocument對象 xmldocument doc = new xmldocument ( ) ; doc.loadxml (? "<employees> " + "<no1>" + "<name>ma jin hu</name>" + "<zip> 239000 </zip>" + "<address>feng huang street</address>" + "<city>chu zhou city</city>" + "<state> anhui </state>" + "</no1>" + "<no2>" + "<name>wang tian</name>" + "<zip> 239000 </zip>" + "<address>lang ya street</address>" + "<city>he fei city</city>" + "<state> anhui </state>" + "</no2>" + "<no3>" + "<name>zou wen biao</name>" + "<zip> 100000 </zip>" + "<address>sai di street</address>" + "<city>bei jin city</city>" + "<state>bei jin</state>" + "</no3>" + "</employees>" ) ; //保存這個文檔到文件中 doc.save ( "data.xml" ) ; } }? |
??? 用c#創建xml文檔的方法其實有很多,在這里只是選取了二種比較典型的方法加以介紹。但無論那一種方法,c#在創建xml的時候都需要用到.net framework sdk。所以了解并掌握這個類庫中的內容對于c#編程是十分必要的,在下面我們將來介紹一下用c#讀取xml中的數據,通過這你會發現,c#又是利用這個類庫實現這個功能的。?
??? 三.c#讀取xml文件:?
本節將用c#來讀取本文中用第二種方法創建的xml文件,編譯no2.cs后,執行將產生"data.xml"文件,其中"data.xml"文件的數據結構如下:?
<employees> <no1> <name>ma jin hu</name> <zip> 239000 </zip> <address>feng huang street</address> <city>chu zhou city</city> <state> anhui </state> </no1> <no2> <name>wang tian</name> <zip> 239000 </zip> <address>lang ya street</address> <city>he fei city</city> <state> anhui </state> </no2> <no3> <name>zou wen biao</name> <zip> 100000 </zip> <address>sai di street</address> <city>bei jin city</city> <state>bei jin</state> </no3> </employees>? |
在下面的內容中,我們利用c#讀取此文件,并用listview組件按照數據結構給顯示出來。下圖是讀取此xml后的運行界面:?
圖01:c#讀取xml后的運行界面?
要正確讀取xml數據,首先要了解xml的結構。根據上面的xml文件,可以知道此xml包含三個數據,下面就來看如何讀取這三條數據:?
◇裝入xml文件,形成數據流:?
通過創建一個"xmldocument"對象,然后利用"load"方法,可以把xml文件裝入,具體如下:?
xmldocument doc = new xmldocument ( ) ; // 裝入指定的xml文檔 doc.load ( "c:\\data.xml" ) ;? |
◇讀取xml文件,并顯示出來:?
讀取xml是通過創建"xmlnodereader"對象來實現的,"xmlnodereader"對象主要是用來可以讀取xml的節點數據。在本文的程序中使用到了一些"xmlnodereader"的屬性,譬如"nodetype"屬性,用來判斷讀取得節點是什么類型。"value"是節點的值。下面是讀取xml文件并顯示在listview中的實現代碼,其中listview1是已經創建listview組件:?
while ( reader.read ( ) )? { //判斷當前讀取得節點類型 switch ( reader.nodetype ) { case xmlnodetype.element : s = reader.name ; break ; case xmlnodetype.text : if ( s.equals ( "name" ) ) myitem = listview1.items.add ( reader.value ) ; else myitem.subitems.add ( reader.value ) ; break ; }? }? |
四.c#讀取xml的文件的源程序代碼(read.cs):?
在了解了上面的內容以后,可以得到用c#讀取指定xml文件的完整代碼,具體如下:?
using system ; using system.drawing ; using system.collections ; using system.componentmodel ; using system.windows.forms ; using system.data ; using system.xml ; public class form1 : form { private button button1 ; private listview listview1 ; private system.componentmodel.container components = null ; public form1 ( ) { //初始化窗體中的各個組件 initializecomponent ( ) ; } //清除程序中使用過的資源 protected override void dispose ( bool disposing ) { if ( disposing ) { if ( components != null )? { components.dispose ( ) ; } } base.dispose ( disposing ) ; } private void initializecomponent ( ) { button1 = new button ( ) ; listview1 = new listview ( ) ; suspendlayout ( ) ; button1.anchor = ( ( anchorstyles.bottom | anchorstyles.left )? | anchorstyles.right ) ; button1.location = new point ( 240 , 296 ) ; button1.name = "button1" ; button1.size = new size ( 112 , 37 ) ; button1.tabindex = 0 ; button1.text = "讀取xml文檔" ; button1.click += new system.eventhandler ( button1_click ) ; listview1.anchor = ( ( ( anchorstyles.top | anchorstyles.bottom )? | anchorstyles.left )? | anchorstyles.right ) ; listview1.gridlines = true ; listview1.location = new point ( 10 , 9 ) ; listview1.name = "listview1" ; listview1.size = new size ( 623 , 269 ) ; listview1.tabindex = 1 ; listview1.view = view.details ; this.autoscalebasesize = new size ( 6 , 14 ) ; this.clientsize = new size ( 608 , 348 ) ; this.controls.add ( listview1 ); this.controls.add ( button1 ); this.name = "form1" ; this.startposition = formstartposition.centerscreen ; this.text = "用c#來讀取xml文檔" ; this.resumelayout ( false ) ; } static void main ( )? { application.run ( new form1 ( ) ) ; } private void button1_click ( object sender , system.eventargs e ) { listviewitem myitem = new listviewitem ( ) ; // 構建listview組件 listview1.columns.clear ( ) ;? listview1.items.clear ( ) ; listview1.columns.add ( "name" , 80 , horizontalalignment.left ) ;? listview1.columns.add ( "zip" , 80 , horizontalalignment.left ) ;? listview1.columns.add ( "address" , 80 , horizontalalignment.left ) ;? listview1.columns.add ( "city" , 80 , horizontalalignment.left ) ;? listview1.columns.add ( "state" , 80 , horizontalalignment.left ) ;? xmlnodereader reader = null ; try { string s = "" ; xmldocument doc = new xmldocument ( ) ; // 裝入指定的xml文檔 doc.load ( "c:\\data.xml" ) ; // 設定xmlnodereader對象來打開xml文件 reader = new xmlnodereader ( doc ) ; // 讀取xml文件中的數據,并顯示出來 while ( reader.read ( ) )? { //判斷當前讀取得節點類型 switch ( reader.nodetype ) { case xmlnodetype.element : s = reader.name ; break ; case xmlnodetype.text : if ( s.equals ( "name" ) ) myitem = listview1.items.add ( reader.value ) ; else myitem.subitems.add ( reader.value ) ; break ; }? } } finally { //清除打開的數據流 if ( reader != null ) reader.close ( ) ; } } }? |
五.總結:?
c#和xml的淵源是很深的,本文只是從一個側面反映了二者關系的密切程度。在.net framework sdk中存在許多可以直接操作xml的類庫,掌握這些類庫的使用方法,對用c#開發和xml相關程序是十分必要的。?