2012-06-19 52 views
0

我有一個XML文件,其中包含超過50 000條記錄(而未來的記錄最多可能有500 000條記錄)。每個記錄有3個級別 - 主級別(用於區分記錄),通用數據級別(標籤包含定義每條記錄的屬性),第三級別包含每條記錄特有的數據(主要是屬性,但有時也是內部文本)。我的任務是將這個文件「解剖」成多個較小的文件。第三級有一個屬性決定整個記錄屬於哪個組。將XML中的數據複製到新文件中

的算法應該是這樣的:

對於每個記錄在文件中:

  • 讀取包含有必要確定與該記錄所屬的組的信息的屬性(這是很容易,我解決了這部分)
  • 複製整個記錄(每級每一個字母)到相應的文件

所以我的問題是什麼是將數據複製到新文件中最簡單(也是最有效的方法)?請記住,我需要複製整個記錄,而不僅僅是一些特定的數據。我正在使用VS 2010的C#工作。

+0

您能否提供XML的結構,應該可以構建一個XSLT文件來爲您完成此操作。 –

回答

1

您可以使用XmlReader來瀏覽源文件的節點,並且一旦遇到滿足您要求的節點,只需讀取它並複製到新文件中即可(InnerXml當前節點的屬性會給你它可以存儲到一個新文件的整個字符串表示)。

順便說一下,如果您希望您的XML增長到數百萬記錄的大小,我會建議您預先預測這種增長並切換到更適合處理這些數據量的數據庫。

+0

這跳過了第一級。我需要複製整個記錄。 InnerXml只有第二和第三級,但不是第一級。 – NDraskovic

+0

然後,您將不得不將參考(作爲局部變量)存儲到此頂層。只要遇到所需的節點,只需將其設置爲變量即可。當條件稍後滿足時,重用此引用並調用InnerXml。 –

1

最有效的方式(關於性能)將有一個單一的XmlReader實例,通過你的大文件。 由於您有多個可能成爲目標的組,因此您應該有多個XmlWriter實例,您可以根據需要創建這些實例並將其存儲在由「group key」索引的字典中,以供下一次迭代使用。

使用XmlReaderXmlWriter可避免將整個文件加載到內存中。

要跟蹤您經歷的嵌套級別,您可以使用Stack,當您向內導航時推送項目,在向外導航時彈出,或者僅在方法中使用局部變量。

當你完成後,不要忘記關閉你的Stream實例。

0

通過System.Xml您可以執行操作。創建List<XmlElement>並覆蓋每個級別的三個級別。

XmlDocument doc = new XmlDocument(); 
     doc.Load("Test.xml"); 
     XmlElement root = doc.DocumentElement; 
    //Preform your read and write operation here 
    doc.Save("Test.xml"); 
相關問題