2016-11-07 21 views
0

我是C#的新手。我有一個相對較大的XML文件(28MB),並試圖根據它們的內容將它的子樹解析成幾種不同的類型。從本質上講,我有6900+個內容節點,所有內容節點都必須經過詢問才能確定它們是什麼類型。在C#中將大型XML讀入不同節點類型的高效方法

<Collections> 
    <Content>..</Content> 
    <Content>..</Content> 
    <Content>..</Content> 
    ... 
</Collections> 

對於每個內容節點,它下面的各種節點可以有3種不同的模式中的一種。我必須查看節點來決定我正在查看的對象的哪種模式/類型。所以想象一個內容節點中有大約100個子節點,第14個節點(在一種情況下)中有一個URL,並表示它是一個「類型1」,應該有字段1,2, 3,... 17,28,47和58寫入DB。

另一種類型具有指示性元素對(假設元素3和58),並指示它是一個「類型2」並且應該有一組不同的元素寫入數據庫。

等等......

從那裏,我映射對象爲CMS/DB和各種數據的在其他系統連接到田野,跨過到DB寫入從相關元素的數據。

由於源文件很大,我希望能夠有效地將子樹從較大的文件中拉出來,拉上拉下拉(取決於它們的類型),然後將重要數據(映射到數據庫) 。

我是否必須以某種方式存儲值,並在存儲它們之後做出決定,這是什麼類型的對象?

我正在努力使用XmlReader的僅前向方法和使用基於DOM的方法的簡便性。

感謝您的意見。

===編輯==== 謝謝你的評論者。內容節點內部的結構將有三種模式中的一種。每種類型都有大約100個節點,所以爲了便於閱讀,我沒有費心去粘貼它們。儘管如此,我的確嘗試並澄清。

+0

喜歡的東西[如何讀取大的XML文件,而不在內存中加載並使用的XElement(http://stackoverflow.com/questions/2249875/how-to-read-large-xml-文件沒有加載,它-內存和-使用-的XElement)? – dbc

+0

您的示例x​​ml不顯示不同的內容類型。 –

回答

0

對於大文件,您必須使用xmlreader。我更喜歡使用xmlreeader和xml linq的組合。嘗試以下操作:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XmlReader reader = XmlReader.Create(FILENAME); 
      while (!reader.EOF) 
      { 
       if (reader.Name != "Content") 
       { 
        reader.ReadToFollowing("Content"); 
       } 
       if (!reader.EOF) 
       { 
        XElement content = (XElement)XElement.ReadFrom(reader); 
       } 
      } 
     } 
    } 
} 
+0

如何詢問內容節點本身的內容?那是: – JuddGledhill

+0

(對不起,我沒有時間編輯我的評論)如何詢問內容節點本身的內容?是:'XElement content =(XElement)XElement.ReadFrom(reader);'線?我是否可以將這個XElement傳遞給另一種方法來反彈它的結構並正確映射它,或者它也只是一個前向類型的東西? – JuddGledhill

+0

您會像處理任何其他xml linq查詢一樣查詢'XElement內容'。每個'WHILE LOOP'只會得到一個節點,因此您可能需要創建一個List <>對象,以便將結果合併到一個對象中。 – jdweng