譯 修改大XML檔案的有效方法

2021-05-23 02:33:50 字數 3895 閱讀 8559

【譯】修改大xml檔案的有效方法

by dare obasanjo

microsoft corporation

april 2004

譯by 烈火青春

2010-07-18

概述:dare obasanjo

展示了兩種方法來更新或操作大xml檔案,如日誌檔案、資料庫的dump檔案。

介紹:隨著xml越來越流行於作為儲存大量資訊的帶格式檔案,開發者已經意識到了編輯大xml檔案的問題了。對那些記錄著日誌檔案並需要不斷追加資訊到這些檔案中的應用尤為突出。大多數簡單的方法來編輯xml檔案就是直接用xmldocument來載入,然後在記憶體中編輯document物件,然後再儲存回到磁碟中。然而這樣做意味著整個xml都載入到了記憶體中,這可能會讓應用程式佔在大量記憶體而變得不可行。

本文本展示了一些不需要用xmldocument載入xml檔案來來修改xml檔案的方法。

使用xml

包含的方法

(using xml inclusion techniques)

將要介紹的第一種方法非常適合於追加資料到xml日誌檔案中。開發者常面對的乙個問題是需要簡單地追加一些新實體到乙個日誌檔案,而不是先載入整個document。因為xml有著規則的結構,所以用傳統方式將乙個實體追加到檔案的結尾是基本不可行的。

這個方法將會展示的是能夠快速在xml document中插入乙個物件。該方法需要產生兩個檔案,第乙個是xml結構檔案,而第二個檔案是乙個xml資料片段。xml結構檔案包含包著xml片段的定義,採用外部定義實體的方式dtd或使用xi:include element。採用這種包含xml片段的檔案,就可以簡單地直接追加檔案到xml中。以下是乙個採用xml定義與xml片段分離的例子:

這個logfile-entires.txt檔案包含著xml片段資料,可以有效地使用典型的檔案io操作函式。下面的**展示著乙個實體是如何追加到這個xml日誌檔案中:

using system;

using system.io;

using system.xml;

public class test }

一旦實體追加到這個txt檔案中後,通過傳統地xml處理方式就可以讀到這個資料。下面的**採用xpath來遍歷logfile.xml中的所有events,列表展示出所有訪問過的頁面資訊。

using system;

using system.xml;

public class test2 accessed at ", file, date);

}} }

這段**的輸出是:

index.html accessed at 2004-04-01t17:35:20.0656808-08:00

stylesheet.css accessed at 2004-04-01t17:35:23.0656120-08:00

logo.gif accessed at 2004-04-01t17:35:25.238220-08:00

comments.aspx accessed at 1999-05-05t19:25:13.238220-08:00

chaining an xmlreader to an xmlwriter

某些情況下可能需要對xml檔案進行更細緻的操作此外還有僅需要在根結點插入乙個元素的操作。例如,可能在日誌檔案存檔時需要將不滿足某些規則的元素篩選出來。一般的做法是載入xml到xmldocument中,然後將通過xpath將這些規則下的元素選擇出來。然後,這樣做需要將整個xml加到記憶體中,如果文件太大程式可能會崩潰。另乙個想到是利用xslt來解決,但同樣這樣也會面臨xmldocument載入所有到記憶體中的問題。當然,開發人員可能還不熟悉xslt的話,要理解如何用模板匹配屬性跨度就有點大了。

乙個解決這類問題的方法就是如何用xmlreader讀取xml檔案,加以處理處理大xml檔案,然後再用xmlwriter寫出已經讀出的內容。這種方法不會一次性將整個檔案載入到記憶體中,在簡單地追加寫檔案前可以做各種操作。下面的**就展示著,從前面讀到xml檔案,然後儲存xml檔案前,排除ip=「127.0.0.1」的元素資料。(**可以粘帖至控制台程式執行來檢視結果!)

} 上面的**將會輸出到乙個logfile-archive.xml檔案中:

192.168.0.1

post

comments.aspx

1999-05-05t19:25:13.238220-08:00

在上面**中除了使用xmlreader來傳到xmlwriter外,還使用了nametable來提公升從readevent()方法中取取元素的名稱比較的效能。這種使用法在xmlreader中的好處已經在msdn中的

object comparison using xmlnametable with xmlreader

一文中指出。

修改大型 XML 檔案的有效方法

隨著 xml 成為大型資訊源的常用表示格式,開發人員編輯大型 xml 檔案時開始遇到問題。對於處理大型日誌檔案以及經常需要為這些檔案追加資訊的應用程式,尤其如此。編輯 xml 檔案最直接的方法是,將其載入到 xmldocument 中,在記憶體中修改文件,然後將其儲存回磁碟。但是,這樣做意味著要將整...

讀取和修改大檔案的某行內容

最近碰到乙個比較有趣的問題,就是修改某個檔案的某一行字元,不過檔案太大,file 直接讀取是不可能的,我使用fgets來跳轉到指定行,並用fwrite修改某個字串 fp fopen d file.txt r if fp fgets fp i fclose fp 這裡需要注意的是fgets獲取到一行後...

PYTHON讀寫xml檔案的方法

要生成的xml檔案格式如下 python sample xml thing ma xiaoju springs widgets,inc.first i think widgets are greate.you should buy lots of them forom spirngy widgts,...