2012-02-08 80 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