Xml作為數據存儲的一種方式,當數據非常大的時候,我們將碰到很多Xml處理的問題。通常,我們對Xml文 件進行編輯的最直接的方式是將xml文件加載到XmlDocument,在內存中來對XmlDocument進行修改,然後再保 存到磁盤中。這樣的話我們將不得不將整個XML document 加載到內存中,這明顯是不明智的(對於大數據XML 文件來說,內存將消耗很大,哥表示鴨梨很大)。下面我們將要講的是如何高效的增加內容(對象實體內容) 到xml日志文件中。
(一)設計概要
總體來說,我們將(通過代碼)創建兩種不同的文件,第 一種為Xml文件,第二種為xml片段(txt文件),如下圖所示:
我們通過如下的定義來使2個不同的文件相關聯。
<!ENTITY yourEntityRefName SYSTEM "your xml fragement address(relative or obsolute address) ">
(二)xml 文件的生成
先來看下如何創建相關的xml文件,代碼如下:
private static void InitXmlFile(string xmlLogFilePath, string xmlLogContentFileName, string entityRef) { string docType = string.Format("\n<!DOCTYPE XmlLogFile \n [ \n <!ENTITY {0} SYSTEM \"{1}\">\n ]>\n", entityRef, xmlLogContentFileName); XmlWriterSettings wrapperSettings = new XmlWriterSettings() { Indent = true }; using (XmlWriter writer = XmlWriter.Create(xmlLogFilePath, wrapperSettings)) { writer.WriteStartDocument(); writer.WriteRaw(docType); writer.WriteStartElement(ConfigResource.XmlLogFile); writer.WriteStartElement(ConfigResource.XmlLogContent); writer.WriteEntityRef(entityRef); writer.WriteEndElement(); writer.WriteEndElement(); writer.Close(); } }
對xml文件內容的寫入主要通過XmlWriter來進行操作的。這個方法比較簡單,不再講解,看下我們通過這 個方法生成的文件內容:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE XmlLogFile [ <!ENTITY Locations SYSTEM "XmlLogContentFile-20110220000120.txt"> ]> <XmlLogFile> <XmlLogContent>&Locations;</XmlLogContent> </XmlLogFile>
Locations 為實體引用名稱,與之相對應的為&Locations; 。
XmlLogContentFile-20110220000120.txt為Xml片段的文件名稱,路徑是相對於XmlLogFile- 20110220000120.xml的。
&Locations;相當於占位符的作用,將用XmlLogContentFile- 20110220000120.txt文件的內容來替換XmlLogFile-20110220000120.xml的&Locations;