在.NET Framework中輕鬆處理XML資料(五) (轉)
設計ReadWriter類microsoft-com::office" />
如前面所說,XML reader和Writer是各自獨立工作的:reader只讀,writer只寫。假設你的應用要管理冗長的XML文件,且該文件有不確定的資料。Reader提供了一個很好的方法去讀該文件的內容。另一方面,Writer是一個非常有用的用於建立XML文件片斷工具,但是如果你想要它即能讀,又能寫,那麼你就要用XML了。如果實際的XML文件非常龐大,又會出現了一個問題,什麼問題呢?是不是把這個XML文件全部載入到中,然後進行讀和寫呢?讓我們先看一下怎麼樣建立一個混合的流分析器用於分析大型的XMLDOM。
像一般的只讀操作一樣,用普通的XML reader去順序的訪問節點。不同的是,在讀的同時你可以用XML writer改變屬性值以及節點的內容。你用reader去讀源中的每個節點,後臺的writer建立該節點的一個複製。在這個複製中,你可以增加一些新的節點,忽略或者編輯其它的一些節點,還可以編輯屬性的值。當你完成修改後,你就用新的文件替換舊的文件。
一個簡單有效的辦法是從只讀流中複製節點到write流中,這種方法可以用XmlTextWriter類中的兩個方法:WriteAttributes方法和WriteNode方法。 WriteAttributes方法讀取當前reader中選中的節點的所有有效的屬性,然後把屬性當作一個單獨的string複製到當前的輸出流中。同樣的,WriteNode方法用類似的方法處理除屬性節點外的其它型別的節點。圖十所示的程式碼片斷演示了怎麼用上述的兩個方法建立一個源XML文件的複製,有選擇的修改某些節點。XML樹從樹根開始被訪問,但只輸出了除屬性節點型別以外的其它型別的節點。你可以把Reader和Writer整合在一個新的類中,設計一個新的介面,使它能讀寫流及訪問屬性和節點。
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根節點
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
writer.WriteEndElement();
// Close reader and writer
writer.Close();
reader.Close();
我的XmlTextReadWriter類並沒有從XmlReader或者XmlWriter類中繼承。取而代之的是另外兩個類,一個是基於只讀流(stream)的操作類,另一個是基於只寫流的操作類。XmlTextReadWriter類的方法用Reader物件讀資料,寫入到Writer物件。為了適應不同的需求,內部的Reader和Writer 物件分別透過只讀的Reader和Writer屬性公開。圖十一列出了該類的一些方法:
Figure 11 XmlTextReadWriter Class Methods
Method
Description
AddAttributeChange
Caches all the information needed to perfoa 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
Tenates 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.
這個新類有一個Read方法,它是對Reader的read方法的一個簡單的封裝。另外,它提供了WriterStartDocument和WriteEndDocument方法。它們分別初始化/釋放(finalize)了內部Reader和writer物件,還處理所有I/O操作。在迴圈讀節點的同時,我們就可以直接的修改節點。出於的原因,要修改屬性必須先用AddAttributeChange方法宣告。對一個節點的屬性所作的所有修改都會存放在一個臨時的表中,最後,透過WriteAttribute方法提交修改,清除臨時表。
圖十二所示的程式碼演示了客戶端用XmlTextReadWriter類在讀操作的同時修改屬性值的優勢。在本期的msdn中提供了XmlTextReadWriter類的和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);
// 手工修改根節點
rw.Writer.WriteStartElement(rw.Reader.LocalName);
// 開始修改屬性
// (可以修改更多節點的屬性)
rw.AddAttributeChange(nodeName, attribName, oldVal, newVal);
// 迴圈處理文件
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 res
rw.WriteEndDocument();
}
XmlTextReadWriter類不僅可以讀XML文件,也可以寫XML文件。你可以它來讀XML文件的內容,如果需要,你還可以用它來做一些基本的操作。基本的更新操作在這裡是指修改某個已存在的屬性的值或者某個節點的內容,又或者是增加一個新的屬性或節點。對於更復雜的操作,最好還是用XMLDOM分析器。
總結
Reader和Writer是 中處理XML資料的根本。它們提供了對所有XML資料訪問功能的原始的。Reader像一個新的分析器類,它即有XMLDOM的強大,又有SAX的簡單。Writer為簡單的建立XML文件而設計。雖然Reader和Writer都是.NET Framework中的一小塊,但是它們是相互獨立的API。在本文中,我們只討論了怎麼樣用Reader和Writer完成一些主要的工作, 介紹了驗證分析器的原理機制,並把Reader和writer整合在一個單獨的類中。上述所有的這些類都是輕量級的,類似於遊標式的XMLDOM分析器。來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-958962/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在.NET Framework中輕鬆處理XML資料(一) (轉)FrameworkXML
- 掌握BeanShell,輕鬆處理jmeter中的資料BeanJMeter
- ASP.NET 2.0中XML資料的處理ASP.NETXML
- 在`Laravel`中使用`cursor`來查詢並處理資料 (輕鬆處理千萬級的資料)Laravel
- 在Laravel中使用cursor來查詢並處理資料 (輕鬆處理千萬級的資料)Laravel
- 效率提升50倍,輕鬆處理大資料大資料
- 輕鬆實現session的mysql處理 (轉)SessionMySql
- BI與SaaS碰撞,讓資料處理更加輕鬆(下)
- 在.NET中輕鬆獲取系統資訊(1) -WMI篇 (轉)
- Pandas缺失值處理 | 輕鬆玩轉Pandas(3)
- 60萬行的Excel資料,Python輕鬆處理ExcelPython
- 輕鬆使用Aspire rabbitmq frameworkMQFramework
- XML輕鬆學習手冊(3)XML概念之一(轉)XML
- XML輕鬆學習手冊(6)XML例項解析(轉)XML
- 使用JDOM處理XML資料之PDF篇(二) (轉)XML
- 使用JDOM處理XML資料之PDF篇(一) (轉)XML
- 在ASP.NET裡輕鬆實現縮圖 (轉)ASP.NET
- java 如何簡單快速處理 xml 中的資料JavaXML
- XML輕鬆學習手冊(5)XML語法之二(轉)XML
- XML輕鬆學習手冊(5)XML語法之四(轉)XML
- 如何在Java中輕鬆處理Emoji Unicode - UdayakumarJavaUnicode
- lubridate—輕鬆處理日期時間
- 使用JDOM處理XML資料之XSLT篇(二) (轉)XML
- 使用JDOM處理XML資料之XSLT篇(一) (轉)XML
- 【下一代物件專題】星辰天合OCPF,輕鬆玩轉各類資料處理物件
- XML輕鬆學習手冊(4)XML的術語之二(轉)XML
- XML輕鬆學習手冊(2)XML快速入門之二(轉)XML
- XML輕鬆學習手冊(2)XML快速入門之三(轉)XML
- JSP筆記-XML 資料處理JS筆記XML
- 處理XML資料應用實踐XML
- 在BCB中輕鬆使用ActiveX控制元件 (轉)控制元件
- EMQX Cloud 更新:更易用的規則引擎,三步輕鬆實現資料處理轉存MQCloud
- Flex 3處理資料 訪問 XML 資料4FlexXML
- Python資料處理(一):處理 JSON、XML、CSV 三種格式資料PythonJSONXML
- 十年期貨股票行情資料輕鬆處理——TDengine在同心源基金的應用
- 用JDOM處理XML文件 (轉)XML
- netty系列之:在netty中處理CORSNettyCORS
- Flex3處理資料 訪問 XML 資料1FlexXML