2012-02-23 45 views
1

我有一個具有以下結構的大型XML文件。我需要解析一個大的XML文件。最佳實踐?

<tree> 
    <limb> 
     <DATA0> 
    </limb> 
    <limb> 
     <DATA1> 
    </limb> 
    <limb> 
     <DATA2> 
    </limb> 
</tree> 

有幾千個肢體元素,每個都有子元素。我需要解析這個文件,並將這些肢體元素以100 - 200個項目集合的形式提取出來,然後根據這些數據創建一個新的XML文件。

是否有執行此操作的首選方法?我只知道C#的初級/中級水平,並且已經使用XML文件工作了一段時間。

我正在考慮編寫一個計算肢體元素總數的循環,執行一個計算以確定我將需要的新XML文檔的數量(5000肢體元素/批次爲200 == xmldocuments)。從那裏,我需要讀取前200套,將它們複製到一個新文件中,保存它,然後重新開始,直到文件結束。

我的邏輯看起來有瑕疵嗎?

+2

如果你只是需要從一個模式轉換XML到另一個模式,XSLT可能是這項工作更合適的工具。 – 2012-02-23 02:39:56

+0

考慮將它作爲正常的性能問題來處理 - 你真的在你的應用程序中使用「大」文件有問題,如果是的話 - 測量。您遇到的數字看起來不像會導致任何內置XML讀取的嚴重問題。 – 2012-02-23 03:04:11

回答

2

如果文檔太大而無法加載到內存中,則可以使用XmlReader。您可以創建自己的XmlReader的子類。除非文件大於內存大小的10-20%,或者你需要它快,否則可能不值得花費額外的努力。

2

LINQ到XML羅伯特鏈接看起來像:

XElement xfile = XElement.Load(file); 
var limbs = xfile.Elements("limb"); 
int count = limbs.Count(); 
var first200 = limbs.Take(200); 
var next200 = limbs.Skip(200).Take(200); 
0

有可能是,如果你在C#專家,沒有時間到別的學到什麼東西在C#寫這個藉口,但由於事實並非如此,因此XSLT是一個更好的工具 - 特別是XSLT 2.0,因爲它可以生成多個輸出文件。 (您可以在C#環境中使用兩個XSLT 2.0處理器 - Saxon和XQSharp)。它看起來在XSLT很簡單的工作,是這樣的:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

<xsl:template match="/"> 
    <xsl:for-each-group select="//limb" group-adjacent="(position()-1) idiv 200"> 
    <xsl:result-document href="batch{position()}.xml"> 
     <batch> 
     <xsl:copy-of select="current-group()"/> 
     </batch> 
    </xsl:result-document> 
    </xsl:for-each-group> 
</xsl:template> 

</xsl:stylesheet> 
+0

今天我要說這個。感謝您的信息,它看起來應該起作用。 – TheHorse1234 2012-02-23 13:42:47