六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

.NET Framework簡(jiǎn)單處理XML數(shù)據(jù)(5)

[摘要]設(shè)計(jì)XmlReadWriter類   如前面所說,XML reader和Writer是各自獨(dú)立工作的:reader只讀,writer只寫。假設(shè)你的應(yīng)用程序要管理冗長(zhǎng)的XML文檔,且該文檔有不確定的數(shù)據(jù)。Reader提供了一個(gè)很好的方法去讀該文檔的內(nèi)容。另一方面,Writer是一個(gè)非常有用的用于創(chuàng)建...
設(shè)計(jì)XmlReadWriter類
  如前面所說,XML reader和Writer是各自獨(dú)立工作的:reader只讀,writer只寫。假設(shè)你的應(yīng)用程序要管理冗長(zhǎng)的XML文檔,且該文檔有不確定的數(shù)據(jù)。Reader提供了一個(gè)很好的方法去讀該文檔的內(nèi)容。另一方面,Writer是一個(gè)非常有用的用于創(chuàng)建XML文檔片斷工具,但是如果你想要它即能讀,又能寫,那么你就要用XMLDOM了。如果實(shí)際的XML文檔非常龐大,又會(huì)出現(xiàn)了一個(gè)問題,什么問題呢?是不是把這個(gè)XML文檔全部加載到內(nèi)存中,然后進(jìn)行讀和寫呢?讓我們先看一下怎么樣建立一個(gè)混合的流分析器用于分析大型的XMLDOM。
  像一般的只讀操作一樣,用普通的XML reader去順序的訪問節(jié)點(diǎn)。不同的是,在讀的同時(shí)你可以用XML writer改變屬性值以及節(jié)點(diǎn)的內(nèi)容。你用reader去讀源文件中的每個(gè)節(jié)點(diǎn),后臺(tái)的writer創(chuàng)建該節(jié)點(diǎn)的一個(gè)拷貝。在這個(gè)拷貝中,你可以增加一些新的節(jié)點(diǎn),忽略或者編輯其它的一些節(jié)點(diǎn),還可以編輯屬性的值。當(dāng)你完成修改后,你就用新的文檔替換舊的文檔。
  一個(gè)簡(jiǎn)單有效的辦法是從只讀流中拷貝節(jié)點(diǎn)對(duì)象到write流中,這種方法可以用XmlTextWriter類中的兩個(gè)方法:WriteAttributes方法和WriteNode方法。 WriteAttributes方法讀取當(dāng)前reader中選中的節(jié)點(diǎn)的所有有效的屬性,然后把屬性當(dāng)作一個(gè)單獨(dú)的string拷貝到當(dāng)前的輸出流中。同樣的,WriteNode方法用類似的方法處理除屬性節(jié)點(diǎn)外的其它類型的節(jié)點(diǎn)。圖十所示的代碼片斷演示了怎么用上述的兩個(gè)方法創(chuàng)建一個(gè)源XML文檔的拷貝,有選擇的修改某些節(jié)點(diǎn)。XML樹從樹根開始被訪問,但只輸出了除屬性節(jié)點(diǎn)類型以外的其它類型的節(jié)點(diǎn)。你可以把Reader和Writer整合在一個(gè)新的類中,設(shè)計(jì)一個(gè)新的接口,使它能讀寫流及訪問屬性和節(jié)點(diǎn)。
Figure 10 Using the WriteNode Method
XmlTextReader reader = new XmlTextReader(inputFile);
XmlTextWriter writer = new XmlTextWriter(outputFile);
 
// 配置 reader 和 writer
writer.Formatting = Formatting.Indented;
reader.MoveToContent();
 
// Write根節(jié)點(diǎn)
writer.WriteStartElement(reader.LocalName);
 
// Read and output every other node
int i=0;
while(reader.Read())
{
if (i % 2)
writer.WriteNode(reader, false);
i++;
}
 
// Close the root
writer.WriteEndElement();
 
// Close reader and writer
writer.Close();
reader.Close();
  我的XmlTextReadWriter類并沒有從XmlReader或者XmlWriter類中繼承。取而代之的是另外兩個(gè)類,一個(gè)是基于只讀流(stream)的操作類,另一個(gè)是基于只寫流的操作類。XmlTextReadWriter類的方法用Reader對(duì)象讀數(shù)據(jù),寫入到Writer對(duì)象。為了適應(yīng)不同的需求,內(nèi)部的Reader和Writer 對(duì)象分別通過只讀的Reader和Writer屬性公開。圖十一列出了該類的一些方法:
Figure 11 XmlTextReadWriter Class Methods
Method
Description
AddAttributeChange
Caches all the information needed to perform a change on a node attribute. All the changes cached through this method are processed during a successive call to WriteAttributes.
Read
Simple wrapper around the internal reader’s Read method.
WriteAttributes
Specialized version of the writer’s WriteAttributes method, writes out all the attributes for the given node, taking into account all the changes cached through the AddAttributeChange method.
WriteEndDocument
Terminates the current document in the writer and closes both the reader and the writer.
WriteStartDocument
Prepares the internal writer to output the document and add a default comment text and the standard XML prolog.

  這個(gè)新類有一個(gè)Read方法,它是對(duì)Reader的read方法的一個(gè)簡(jiǎn)單的封裝。另外,它提供了WriterStartDocument和WriteEndDocument方法。它們分別初始化/釋放(finalize)了內(nèi)部Reader和writer對(duì)象,還處理所有I/O操作。在循環(huán)讀節(jié)點(diǎn)的同時(shí),我們就可以直接的修改節(jié)點(diǎn)。出于性能的原因,要修改屬性必須先用AddAttributeChange方法聲明。對(duì)一個(gè)節(jié)點(diǎn)的屬性所作的所有修改都會(huì)存放在一個(gè)臨時(shí)的表中,最后,通過調(diào)用WriteAttribute方法提交修改,清除臨時(shí)表。
  圖十二所示的代碼演示了客戶端用XmlTextReadWriter類在讀操作的同時(shí)修改屬性值的優(yōu)勢(shì)。在本期的msdn中提供了XmlTextReadWriter類的C#和VB源代碼下載(見本文開頭提供的鏈接)。
Figure 12 Changing Attribute Values
private void ApplyChanges(string nodeName, string attribName,
string oldVal, string newVal)
{
XmlTextReadWriter rw = new XmlTextReadWriter(InputFileName.Text,
OutputFileName.Text);
rw.WriteStartDocument(true, CommentText.Text);
 
// 手工修改根節(jié)點(diǎn)
rw.Writer.WriteStartElement(rw.Reader.LocalName);
 
// 開始修改屬性
// (可以修改更多節(jié)點(diǎn)的屬性)
rw.AddAttributeChange(nodeName, attribName, oldVal, newVal);
 
// 循環(huán)處理文檔
while(rw.Read())
{
switch(rw.NodeType)
{
case XmlNodeType.Element:
rw.Writer.WriteStartElement(rw.Reader.LocalName);
if (nodeName == rw.Reader.LocalName)
// 修改屬性
rw.WriteAttributes(nodeName);
else
// deep copy
rw.Writer.WriteAttributes(rw.Reader, false);
 
if (rw.Reader.IsEmptyElement)
rw.Writer.WriteEndElement();
break;
}
}
 
// Close the root tag
rw.Writer.WriteEndElement();
 
// Close the document and any internal resources
rw.WriteEndDocument();
}
 
  XmlTextReadWriter類不僅可以讀XML文檔,也可以寫XML文檔。你可以它來讀XML文檔的內(nèi)容,如果需要,你還可以用它來做一些基本的更新操作。基本的更新操作在這里是指修改某個(gè)已存在的屬性的值或者某個(gè)節(jié)點(diǎn)的內(nèi)容,又或者是增加一個(gè)新的屬性或節(jié)點(diǎn)。對(duì)于更復(fù)雜的操作,最好還是用XMLDOM分析器。
  總結(jié)
  Reader和Writer是.NET Framework中處理XML數(shù)據(jù)的根本。它們提供了對(duì)所有XML數(shù)據(jù)訪問功能的原始的API。Reader像一個(gè)新的分析器類,它即有XMLDOM的強(qiáng)大,又有SAX的快速簡(jiǎn)單。Writer為簡(jiǎn)單的創(chuàng)建XML文檔而設(shè)計(jì)。雖然Reader和Writer都是.NET Framework中的一小塊,但是它們是相互獨(dú)立的API。在本文中,我們只討論了怎么樣用Reader和Writer完成一些主要的工作, 介紹了驗(yàn)證分析器的原理機(jī)制,并把Reader和writer整合在一個(gè)單獨(dú)的類中。上述所有的這些類都是輕量級(jí)的,類似于游標(biāo)式的XMLDOM分析器。



主站蜘蛛池模板: 亚洲国产日韩欧美在线a乱码 | 青春草影院 | 欧美又大又粗又爽又硬 | 亚洲网站视频在线观看 | 欧美专区一区二区三区 | 手机在线日韩高清理论片 | 我想看一级黄色毛片 | 四虎影院最新网址 | 日本大胆欧美人术艺术 | 亚洲一区在线视频 | 欧美污视频网站 | 亚洲一区二区免费看 | 在线久综合色手机在线播放 | 视频一区二区三区在线观看 | 天天干天天上 | 婷婷激情五月网 | 青青草久久 | 青青青在线免费观看 | 日韩女人毛片在线播放 | 日本青青草 | 亚洲国产成人久久综合一区 | 天天干夜干 | 日本在线观看中文 | 日韩精品成人免费观看 | 亚洲国产高清在线精品一区 | 性欧美一级 | 色婷婷99综合久久久精品 | 日日摸夜夜添欧美一区 | 伊人影视大全 | 午夜国产视频 | 午夜色大片 | 色爱区综合小说 | 五月婷婷在线观看视频 | 日本五级床片全部硬硬 | 杨幂国产精品福利在线观看 | 日韩不卡高清 | 最新国产精品亚洲 | 五月天激情婷婷大综合 | 天天五月天丁香婷婷深爱综合 | 在线精品91青草国产在线观看 | 日本一在线中文字幕天堂 |