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

2021-09-30 02:50:49 字數 3593 閱讀 1908

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

這篇**說明了修改 xml 文件的一些可供選擇的方法,這些方法不涉及將文件載入到 xmldocument 例項中的內容。

建議的第一種方法對於向 xml 日誌檔案追加值最為有用。開發人員面臨的常見問題是需要一種能夠將新條目簡單地追加到日誌檔案中而不用載入文件的方法。因為 xml 具有良好結構規則,所以使用傳統方式(這種方法會因為日誌檔案格式不正確而結束日誌檔案)來向 xml 日誌檔案追加條目通常是非常困難的。

要說明的第一種方法是針對這樣的情形,即目的是能夠將條目快速地追加到 xml 文件中。這種方法包括建立兩個檔案。第乙個檔案是格式正確的 xml 檔案,第二個是 xml 片段。格式正確的 xml 檔案包括 xml 片段,xml 片段使用 dtd 中宣告的

external entity

或者使用

xi:include element

。使用包含檔案,通過在進行處理過程中簡單地追加到 xml 檔案,可以有效地更新檔案包含 xml 片段的方法。包含檔案和被包含檔案的示例如下所示:

logfile.xml: 

<?xml version="1.0"?>

]>

&events;

logfile-events.txt:

127.0.0.1

get index.html

2004-04-01t17:35:20.0656808-08:00

127.0.0.1

get stylesheet.css

2004-04-01t17:35:23.0656120-08:00

127.0.0.1

get logo.gif

2004-04-01t17:35:25.238220-08:00

logfile-entries.txt 檔案包括乙個 xml 片段,並且可以使用典型的檔案 io 方法有效地進行更新。下面的**說明了如何通過將條目追加到文字檔案的結尾來將它新增到 xml 日誌檔案中。

using system;

using system.io;

using system.xml;

public class test

}

一旦條目被追加到文字檔案中,使用傳統的 xml 處理方法,就可以處理 xml 日誌檔案中的條目。下面的**使用 xpath 遍歷了 logfile.xml 中的日誌事件,同時列出了它們被訪問時的檔案以及被訪問的檔案。

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

在某些情況下,除了只將元素追加到根元素中外,還需要對 xml 檔案執行更複雜的操作。例如,要篩選日誌檔案中的每乙個條目,而這些條目在存檔到日誌檔案前不符合某些特殊標準。要完成此任務的一種方法是將 xml 檔案載入到 xmldocument 中,然後通過 xpath 選擇感興趣的事件。但是,這樣做涉及將整個文件載入到記憶體中,如果文件太大,則這種做法會受到限制。另一種選擇方法為了這種任務會涉及使用 xslt,但是由於整個 xml 文件需要儲存到記憶體中,這種方法會和 xmldocument 方法一樣遇到相同的問題。另外,由於開發人員不熟悉 xslt,了解如何正確使用模板匹配時會遇到較大的困難。

要解決如何處理大型 xml 文件問題的一種方法是使用 xmlreader 讀取 xml,讀取的同時使用 xmlwriter 將其寫出。使用這種方法,整個文件不會同時存入記憶體中,對 xml 可以進行更精確的更改而不只是追加元素。下面的**示例讀取前面部分的 xml 文件,篩選出所有 ip 元素的值為 "127.0.0.1" 的事件後將其儲存為存檔檔案。

vr.read(); //移到下乙個 元素或 的結尾標記

} while(vr.nodetype == xmlnodetype.element);

console.writeline("done");

vr.close();

xw.close();

}}上面的**示例在寫入到 logfile-archive.xml 檔案中時會導致下面的輸出:

192.168.0.1

post

comments.aspx

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

除了使用 xmlreader 到 xmlwriter 的鏈之外,上面**的另乙個有趣方面是,使用 readevent() 方法檢查元素標記名稱時使用 nametable 提高了文字比較的效能。在 xmlreader 中使用這種方法檢查元素的標記名稱的優點在如下的 msdn 文件主題中進行了概述:

object comparison using xmlnametable with xmlreader

(英文)。

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

譯 修改大xml檔案的有效方法 by dare obasanjo microsoft corporation april 2004 譯by 烈火青春 2010 07 18 概述 dare obasanjo 展示了兩種方法來更新或操作大xml檔案,如日誌檔案 資料庫的dump檔案。介紹 隨著xml越來...

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

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

python處理大型json檔案的方法

先用python進行預處理,即一整個json資料載入慢,那就分開載入,每次載入乙個json物件,然後使用 json.dumps 方法 儲存到txt中,方便讀取。當然也可以儲存到記憶體中,根據情況而定。演算法思想 因為 json 是一種結構化的資料,所以 是成對存在的。因為使用逐行讀取的方法讀入jso...