2012-02-08 84 views
0

我正在使用c#,並從外部數據源創建xml並將xml保存爲單個xml文件。我該如何拆分xml並將其保存爲多個xml文件?例如,假設我的xdocument xml中有263條記錄。我需要將它分成多個包含25個記錄的xml文件。 (這是規範 - 沒有辦法繞過它)。因此,對於這個例子,我最終得到了11個xml文件。使用c分割xml文件#

我的數據源是一個XML文件,如果更容易,我可以選擇將它分成每個XML文件25個記錄的塊。我怎麼會這樣做呢?

+1

該規格需要*稍微*比這更慷慨 - 你*不能*將263條記錄分割成包含* 25條記錄的文件,除非你很樂意跳過一些或重複一些。您是否允許最終文件包含少於25條記錄?目前還不清楚你的第二段如何與你的第一段不同... – 2012-02-08 10:40:31

回答

6

怎麼是這樣的:

string [email protected]"<a> 
    <b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/> 
    <b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/> 
    <b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/> 
    <b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/><b/> 
    </a>"; 

int itemsPerDoc = 25; 

XDocument xDoc = XDocument.Parse(xml); 
IEnumerable<XDocument> newDocs= 
    xDoc 
     .Root 
     //grab all immediate child elements of root (named "b") 
     .Elements("b") 
     //use integer division to create a group "number" 
     //so groups of 25 items will share same group "number" 
     .Select((e,i) => new {g = i/itemsPerDoc, e}) 
     //use group "number" to perform grouping 
     .GroupBy(x => x.g) 
     //now we have groups of 25, use these 25 items 
     //to project into a new document containing the items 
     .Select(gr => { 
      XDocument newDoc = XDocument.Parse("<newDoc/>"); 
      newDoc.Root.Add(gr.Select(p => p.e)); 
      return newDoc; 
     }); 

其中每個文件包含25個(或更少的最後文檔的情況下)的原XDocument的孩子這將返回一個IEnumerable<XDocument>

+0

雖然這看起來可以用於OP,但你可能想要補充一些關於它在做什麼和如何做的解釋。 – Grhm 2012-02-08 11:04:57

+0

@Grhm:我添加了一些評論來說明一些情況。 – spender 2012-02-08 11:12:57

+0

好東西,謝謝! – ManOnAMission 2016-07-14 10:21:13