国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

解析.Net框架下的XML編程技術

2024-07-10 12:59:54
字體:
來源:轉載
供稿:網友
注冊會員,創建你的web開發資料庫,
一.前言:

xml是微軟.net戰略的一個重要組成部分,而且它可謂是xml web服務的基石,所以掌握.net框架下的xml技術自然顯得非常重要了。本文將指導大家如何運用c#語言完成.net框架下的xml文檔的讀寫操作。首先,我會向大家介紹.net框架中與xml相關的命名空間和其中的重要類。其次,我還會給出有關的實例以使讀者更進一步的了解xml文檔的讀寫操作的具體方法。



二.xml命名空間和相關類簡介:

在深入進行.net框架下的xml文檔的操作之前,我想很有必要向大家介紹.net框架中與xml技術有關的命名空間和其中一些重要的類。.net框架為我們提供了以下一些命名空間:system.xml、system.xml.schema、system.xml.serialization、system.xml.xpath以及 system.xml.xsl來包容和xml操作相關的類。

system.xml命名空間包含了一些最重要的xml類,其中最主要的類是和xml文檔的讀寫操作相關的類。這些類中包括4個與讀相關的類以及2個與寫相關的類。它們分別是:xmlreader、xmltextreader、xmlvalidatingreader、xmlnodereader、xmlwriter以及 xmltextwriter。本文將重點介紹這些類,因為它們是最基本也是最重要的類。

xmlreader類是一個虛基類,它包含了讀xml文檔的方法和屬性。該類中的read方法是一個基本的讀xml文檔的方法,它以流形式讀取xml文檔中的節點(node)。另外,該類還提供了readstring、readinnerxml、readouterxml和readstartelement等更高級的讀方法。除了提供讀xml文檔的方法外,xmlreader類還為程序員提供了movetoattribute、movetofirstattribute、movetocontent、movetofirstcontent、movetoelement以及 movetonextattribute等具有導航功能的方法。在本文后面介紹的實例中,我們將運用到這些方法。

xmltextreader、xmlnodereader以及xmlvalidatingreader等類是從xmlreader類繼承過來的子類。根據它們的名稱,我們可以知道其作用分別是讀取文本內容、讀取節點和讀取xml模式(schemas)。

xmlwriter類為程序員提供了許多寫xml文檔的方法,它是xmltextwriter類的基類,我在后面的實例中會給出相關的運用方法。

xmlnode類是一個非常重要的類,它代表了xml文檔中的某個節點。該節點可以是xml文檔的根節點,這樣它就代表整個xml文檔了。它是許多很有用的類的基類,這些類包括插入節點的類、刪除節點的類、替換節點的類以及在xml文檔中完成導航功能的類。同時,xmlnode類還為程序員提供了獲取雙親節點、子節點、最后一個子節點、節點名稱以及節點類型等的屬性。它的三個最主要的子類包括:xmldocument、xmldatadocument以及xmldocumentfragment。xmldocument類代表了一個xml文檔,它提供了載入和保存xml文檔的方法和屬性。這些方法包括了load、loadxml和save等。同時,它還提供了添加特性(attributes)、說明(comments)、空間(spaces)、元素(elements)和新節點(new nodes)等xml項的功能。xmldocumentfragment類代表了一部分xml文檔,它能被用來添加到其他的xml文檔中。xmldatadocument類可以讓程序員更好地完成和ado.net中的數據集對象之間的互操作。

除了上面介紹的system.xml命名空間中的類外,該命名空間還包括了xmlconvert、xmllinkednode以及xmlnodelist等類,不過這些類不是本文介紹的重點,有興趣的讀者不妨去參考相關文檔資料。

system.xml.schema命名空間中包含了和xml模式相關的類,這些類包括xmlschema、xmlschemaall、xmlschemaxpath以及xmlschematype等類。

system.xml.serialization命名空間中包含了和xml文檔的序列化和反序列化操作相關的類,xml文檔的序列化操作能將xml格式的數據轉化為流格式的數據并能在網絡中傳輸,而反序列化則完成相反的操作,即將流格式的數據還原成xml格式的數據。

system.xml.xpath命名空間包含了xpathdocument、xpathexression、xpathnavigator以及xpathnodeiterator等類,這些類能完成xml文檔的導航功能。在xpathdocument類的協助下,xpathnavigator類能完成快速的xml文檔導航功能,該類為程序員提供了許多move方法以完成導航功能。

system.xml.xsl命名空間中的類完成了xslt的轉換功能。



三.讀xml文檔的方法:

在介紹完.net框架中和xml有關的命名空間和相關類后,我接著向大家介紹和xml相關的一些操作。首先,我向大家介紹的讀取xml文檔的方法。在下面的實例程序中,我將運用vs.net開發工具附帶的"books.xml"文件來作為示例。你可以在你的機器上搜索到該文件(或請參考附錄),或者你也可以運用其他的xml文件。

首先,我們用xmltextreader類的對象來讀取該xml文檔。方法很簡單,就是在創建新對象的構造函數中指明xml文件的位置即可。

xmltextreader textreader = new xmltextreader("c://books.xml");

一旦新對象創建完畢,你就可以調用其read方法來讀取xml文檔了。調用read方法之后,信息被存儲起來,你可以通過讀取該對象的name、baseuri、depth、linenumber等屬性來獲取這些信息。下面我給出一個完整的實例,該實例通過簡單的讀取"books.xml"文件,然后將其中的信息顯示在控制臺中。

using system;
using system.xml;

namespace readxml
{
class class1
{
static void main( string[] args )
{
// 創建一個xmltextreader類的對象并調用read方法來讀取文件
xmltextreader textreader = new xmltextreader("c://books.xml");
textreader.read();
// 節點非空則執行循環體
while ( textreader.read() )
{
// 讀取第一個元素
textreader.movetoelement();
console.writeline("xmltextreader properties test");
console.writeline("===================");

// 讀取該元素的屬性并顯示在控制臺中
console.writeline("name:" + textreader.name);
console.writeline("base uri:" + textreader.baseuri);
console.writeline("local name:" + textreader.localname);
console.writeline("attribute count:" + textreader.attributecount.tostring());
console.writeline("depth:" + textreader.depth.tostring());
console.writeline("line number:" + textreader.linenumber.tostring());
console.writeline("node type:" + textreader.nodetype.tostring());
console.writeline("attribute count:" + textreader.value.tostring());
}
}
}
}



xmltextreader類中有一個很重要的屬性-nodetype,通過該屬性,我們可以知道其節點的節點類型。而枚舉類型xmlnodetype中包含了諸如attribute、cdata、element、comment、document、documenttype、entity、processinstruction以及whitespace等的xml項的類型。通過與xmlnodetype中的元素的比較,我們可以獲取相應節點的節點類型并對其完成相關的操作。下面我就給出一個實例,該實例讀取每個節點的nodetype,并根據其節點類型顯示其中的內容,同時程序還記錄了xml文件中每種節點類型的數目。

using system;
using system.xml;

namespace readxml
{
class class2
{
static void main( string[] args )
{
int ws = 0;
int pi = 0;
int dc = 0;
int cc = 0;
int ac = 0;
int et = 0;
int el = 0;
int xd = 0;

xmltextreader textreader = new xmltextreader("c://books.xml");

while (textreader.read())
{
xmlnodetype ntype = textreader.nodetype;

// 節點類型為xmldeclaration
if (ntype == xmlnodetype.xmldeclaration)
{
console.writeline("declaration:" + textreader.name.tostring());
xd = xd + 1;
}

// 節點類型為comment
if( ntype == xmlnodetype.comment)
{
console.writeline("comment:" + textreader.name.tostring());
cc = cc + 1;
}

// 節點類型為attribute
if( ntype == xmlnodetype.attribute)
{
console.writeline("attribute:" + textreader.name.tostring());
ac = ac + 1;
}

// 節點類型為element
if ( ntype == xmlnodetype.element)
{
console.writeline("element:" + textreader.name.tostring());
el = el + 1;
}

// 節點類型為entity
if ( ntype == xmlnodetype.entity )
{
console.writeline("entity:" + textreader.name.tostring());
et = et + 1;
}

// 節點類型為process instruction
if( ntype == xmlnodetype. processinstruction )
{
console.writeline("process instruction:" + textreader.name.tostring());
pi = pi + 1;
}

// 節點類型為documenttype
if( ntype == xmlnodetype.documenttype)
{
console.writeline("documenttype:" + textreader.name.tostring());
dc = dc + 1;
}

// 節點類型為whitespace
if ( ntype == xmlnodetype.whitespace )
{
console.writeline("whitespace:" + textreader.name.tostring());
ws = ws + 1;
}
}

// 在控制臺中顯示每種類型的數目
console.writeline("total comments:" + cc.tostring());
console.writeline("total attributes:" + ac.tostring());
console.writeline("total elements:" + el.tostring());
console.writeline("total entity:" + et.tostring());
console.writeline("total process instructions:" + pi.tostring());
console.writeline("total declaration:" + xd.tostring());
console.writeline("total documenttype:" + dc.tostring());
console.writeline("total whitespaces:" + ws.tostring());
}
}
}



以上,我向大家介紹了如何運用xmltextreader類的對象來讀取xml文檔,并根據節點的nodetype屬性來取得其節點類型信息。同時xmlreader這個基類還有xmlnodereader和xmlvalidatingreader等派生類,它們分別是用來讀取xml文檔的節點和模式的。限于篇幅,這里就不介紹了,讀者可以參考有關資料。



四.寫xml文檔的方法:

xmlwriter類包含了寫xml文檔所需的方法和屬性,它是xmltextwriter類和xmlnodewriter類的基類。該類包含了writenode、writestring、writeattributes、writestartelement以及writeendelement等一系列寫xml文檔的方法,其中有些方法是成對出現的。比如你要寫入一個元素,你首先得調用writestartelement方法,接著寫入實際內容,最后是調用writeendelement方法以表示結束。該類還包含了writestate、xmllang和xmlspace等屬性,其中writestate屬性表明了寫的狀態。因為xmlwriter類包含了很多寫xml文檔的方法,所以這里只是介紹最主要的幾種。下面我們通過其子類xmltextwriter類來說明如何寫xml文檔。

首先,我們要創建一個xmltextwriter類的實例對象。該類的構造函數xmltextwriter有三種重載形式,其參數分別為一個字符串、一個流對象和一個textwriter對象。這里我們運用字符串的參數形式,該字符串就指明了所要創建的xml文件的位置,方法如下:

xmltextwriter textwriter = new xmltextwriter("c://myxmfile.xml", null);



在創建完對象后,我們調用writerstartdocument方法開始寫xml文檔,在完成寫工作后,就調用writeenddocument結束寫過程并調用close方法將它關閉。在寫的過程中,我們可以調用writecomment方法來添加說明,通過調用writestring方法來添加一個字符串,通過調用writestartelement和writeendelement方法對來添加一個元素,通過調用writestartattribute和writeendattribute方法對來添加一個屬性。我們還可以通過調用writenode方法來添加整一個節點,其它的寫的方法還包括writeprocessinginstruction和writedoctype等等。下面的實例就是介紹如何具體運用這些方法來完成xml文檔的寫工作的。

using system;
using system.xml;

namespace writexml
{
class class1
{
static void main( string[] args )
{
// 創建xmltextwriter類的實例對象
xmltextwriter textwriter = new xmltextwriter("c://myxmfile.xml", null);

// 開始寫過程,調用writestartdocument方法
textwriter.writestartdocument();

// 寫入說明
textwriter.writecomment("first comment xmltextwriter sample example");
textwriter.writecomment("myxmlfile.xml in root dir");

// 寫入一個元素
textwriter.writestartelement("name", "");
textwriter.writestring("student");
textwriter.writeendelement();

// 再寫入一個元素
textwriter.writestartelement("address", "");
textwriter.writestring("colony");
textwriter.writeendelement();

// 寫入字符
char [] ch = new char[3];
ch[0] = 'a';
ch[1] = 'r';
ch[2] = 'c';
textwriter.writestartelement("char");
textwriter.writechars(ch, 0, ch.length);
textwriter.writeendelement();

// 寫文檔結束,調用writeenddocument方法
textwriter.writeenddocument();

// 關閉textwriter
textwriter.close();
}
}
}



五.運用xmldocument類:

xmldocument類的對象代表了一個xml文檔,它也是一個非常重要的xml類。該類包含了load、loadxml以及save等重要的方法。其中load方法可以從一個字符串指定的xml文件或是一個流對象、一個textreader對象、一個xmlreader對象導入xml數據。loadxml方法則完成從一個特定的xml文件導入xml數據的功能。它的save方法則將xml數據保存到一個xml文件中或是一個流對象、一個textwriter對象、一個xmlwriter對象中。

下面的程序中我們用到了xmldocument類對象的loadxml方法,它從一個xml文檔段中讀取xml數據并調用其save方法將數據保存在一個文件中。

// 創建一個xmldocument類的對象
xmldocument doc = new xmldocument();
doc.loadxml(("<student type='regular' section='b'><name>tommy lex</name></student>"));

// 保存到文件中
doc.save("c://student.xml");



這里,我們還可以通過改變save方法中參數,將xml數據顯示在控制臺中,方法如下:

doc.save(console.out);



而在下面的程序中,我們用到了一個xmltextreader對象,通過它我們讀取"books.xml"文件中的xml數據。然后創建一個xmldocument對象并載入xmltextreader對象,這樣xml數據就被讀到xmldocument對象中了。最后,通過該對象的save方法將xml數據顯示在控制臺中。

xmldocument doc = new xmldocument();
// 創建一個xmltextreader對象,讀取xml數據
xmltextreader reader = new xmltextreader("c://books.xml");
reader.read();

// 載入xmltextreader類的對象
doc.load(reader);
// 將xml數據顯示在控制臺中
doc.save(console.out);



六.總結:

xml技術作為.net的基石,其重要性自然不言而喻。.net框架包含了五個命名空間和大量的類來支持與xml技術有關的操作。其中system.xml是最重要的一個命名空間,其中的xmlreader類和xmlwriter類以及它們的派生類完成了xml文檔的讀寫操作,是最基本也是最重要的類。xmldocument類代表了xml文檔,它能完成與整個xml文檔相關的各類操作,同時和其相關的xmldatadocument類也是非常重要的,值得讀者的深入研究。



附錄

"books.xml"文件如下:

<?xml version='1.0'?>
<!-- this file represents a fragment of a book store inventory database -->
<bookstore>
<book genre="autobiography" publicationdate="1981" isbn="1-861003-11-0">
<title>the autobiography of benjamin franklin</title>
<author>
<first-name>benjamin</first-name>
<last-name>franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967" isbn="0-201-63361-2">
<title>the confidence man</title>
<author>
<first-name>herman</first-name>
<last-name>melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991" isbn="1-861001-57-6">
<title>the gorgias</title>
<author>
<first-name>sidas</first-name>
<last-name>plato</last-name>
</author>
<price>9.99</price>
</book>
</bookstore>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 五原县| 万载县| 利川市| 江北区| 皮山县| 安乡县| 友谊县| 共和县| 汨罗市| 当涂县| 成都市| 同德县| 灵武市| 财经| 阿拉善右旗| 中方县| 宜良县| 三都| 龙里县| 师宗县| 涿州市| 安龙县| 松江区| 乐都县| 南阳市| 天柱县| 盐山县| 邛崃市| 龙门县| 喀喇| 象山县| 栖霞市| 炎陵县| 宜兰市| 扎赉特旗| 朝阳县| 轮台县| 抚州市| 紫阳县| 古田县| 安阳市|