首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET Framework 輕鬆處理 XML 數據(五):XmlTextReadWriter 讀寫整合元件設計

     編輯:關於.NET

背景動機

XmlReader 唯讀、XmlWriter 唯寫,兩者獨立運作。管理龐大 XML 文檔且需同時讀寫時,DOM 雖支援雙向操作但需全量載入記憶體,效能不佳。本文設計混合流分析器 XmlTextReadWriter,實現邊讀邊寫、選擇性修改。

核心原理

使用 XmlReader 循序訪問源文檔節點,XmlWriter 同步創建節點拷貝。在拷貝過程中可:新增節點、忽略節點、編輯節點內容、修改屬性值。完成後以新文檔替換舊文檔。

關鍵技術:XmlTextWriter 的 WriteAttributes 與 WriteNode

  • WriteAttributes:讀取當前節點所有有效屬性,作為單一字串拷貝至輸出流
  • WriteNode:同理處理非屬性節點
XmlTextReader reader = new XmlTextReader(inputFile);
XmlTextWriter writer = new XmlTextWriter(outputFile);
writer.Formatting = Formatting.Indented;
reader.MoveToContent();
// 寫入根節點
writer.WriteStartElement(reader.LocalName);
// 讀取並輸出每個節點(示例:跳過偶數節點)
int i = 0;
while (reader.Read())
{
    if (i % 2 == 1)
        writer.WriteNode(reader, false);
    i++;
}
writer.WriteEndElement();
writer.Close();
reader.Close();

XmlTextReadWriter 類別設計

不繼承 XmlReader/XmlWriter,而是內部封裝兩者。公開唯讀的 Reader/Writer 屬性供進階操作。

表 11:核心方法

方法功能
AddAttributeChange快取節點屬性變更資訊,WriteAttributes 時批次提交
Read內部 reader.Read 的簡單封裝
WriteAttributes特製版 WriteAttributes,寫出節點所有屬性並套用快取變更
WriteEndDocument終結文檔,關閉 reader 與 writer
WriteStartDocument初始化 writer,加入預設註解與 XML 序言

效能優化:屬性修改批次提交

修改屬性必須先呼叫 AddAttributeChange 宣告,所有變更暫存於臨時表,最後呼叫 WriteAttributes 一次性提交並清除快取。

實戰範例:讀取同時修改屬性值

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
                    rw.Writer.WriteAttributes(rw.Reader, false);  // 深層複製
                if (rw.Reader.IsEmptyElement)
                    rw.Writer.WriteEndElement();
                break;
        }
    }
    
    rw.Writer.WriteEndElement();  // 關閉根標籤
    rw.WriteEndDocument();        // 關閉文檔與資源
}

總結

  • Reader/Writer 是 .NET 處理 XML 的基石,提供底層存取 API
  • Reader 兼具 DOM 功能與 SAX 效能;Writer 簡化 XML 創建
  • 兩者為獨立 API,本文整合為單一類別實現讀寫協同
  • 所有類別皆為輕量級,類似游標式 DOM 分析器
  • 基本更新(屬性/節點值修改、新增屬性/節點)適用此模式;複雜操作仍建議用 XMLDOM
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved