【问题标题】:Split xml into files - method takes less memory将 xml 拆分为文件 - 方法占用更少的内存
【发布时间】:2016-03-27 19:51:44
【问题描述】:

我需要将我的XML 拆分为文件。 这是我的样本XML的结构:

<Data Code="L6POS1">
<Lots RowVersion="464775">
   <Lot Id="5"  Quantity="10068.0000" GUID="AA616D3D-F442-6AEE-0BAB-1D13F6961C2A" />
   <Lot Id="99"  Quantity="0.0000" GUID="24A9C957-EC98-85D5-8F96-0120F6E8A572" />
   <Lot Id="101"  Quantity="0.0000" GUID="124D17A2-1568-DB02-4327-4669FE00F741" />
   <Lot Id="103"  Quantity="0.0000" GUID="DD1730FF-27CF-1269-7AC2-3152CB6FDC46" />
   <Lot Id="105"  Quantity="0.0000" GUID="1F25378F-30D4-E4E0-9939-1E9E69C806C1" />
   <Lot Id="188"  Quantity="0.0000" GUID="2E860029-29B3-54C2-B8D1-0C6ABDA42DFF" />
   <Lot Id="189"  Quantity="0.0000" GUID="D3C58850-BC23-E8DE-A919-09CCB3F8A1D3" />
</Lots>

预期结果:FirstFile:

 <Data Code="L6POS1">
 <Lots RowVersion="464775">
   <Lot Id="5"  Quantity="10068.0000" GUID="AA616D3D-F442-6AEE-0BAB-1D13F6961C2A" />
   <Lot Id="99"  Quantity="0.0000" GUID="24A9C957-EC98-85D5-8F96-0120F6E8A572" />
   <Lot Id="101"  Quantity="0.0000" GUID="124D17A2-1568-DB02-4327-4669FE00F741" />
   <Lot Id="103"  Quantity="0.0000" GUID="DD1730FF-27CF-1269-7AC2-3152CB6FDC46" />   
</Lots>
</Data>

还有SecondFile:

<Data Code="L6POS1">
 <Lots RowVersion="464775">
   <Lot Id="105"  Quantity="0.0000" GUID="1F25378F-30D4-E4E0-9939-1E9E69C806C1" />
   <Lot Id="188"  Quantity="0.0000" GUID="2E860029-29B3-54C2-B8D1-0C6ABDA42DFF" />
   <Lot Id="189"  Quantity="0.0000" GUID="D3C58850-BC23-E8DE-A919-09CCB3F8A1D3" />
</Lots>
</Data>

其实我在用:

   private IEnumerable<XElement> CreateXMLPackagesByType(string syncEntityName, XElement root)
    {
        var xmlList = new List<XElement>();
        IEnumerable<XElement> childNodes = root.Elements();

        var childsCount = childNodes.Count();

        var skip = 0;
        var take = ConfigurationService.MaxImportPackageSize;
        var rootAttributes = root.Attributes();
        XElement rootWithoutDescendants;
        while (skip < childsCount)
        {
            rootWithoutDescendants = new XElement(root.Name);
            rootWithoutDescendants.Add(rootAttributes);

            var elems = childNodes.Skip(skip).Take(take);
            skip += take;
            xmlList.Add(CreatePackage(rootWithoutDescendants, elems));
        }

        return xmlList;
    }


      private XElement CreatePackage(XElement type, IEnumerable<XElement> elems)
    {
        type.Add(elems);
        var root = new XElement("Data", type);
        root.Add(new XAttribute("Code", ConfigurationService.Code));
        return root;
    }

不幸的是,通过这种方式可以在旧硬件上获得带有更大XML 文件的OutOfMemoryException。拆分XElement的更好方法?

【问题讨论】:

  • 考虑 XmlReader 而不是 LINQ to XML?
  • 您需要使用 SAX 解析器而不是文档解析器。正如@Tom 指出的那样,XmlReader 是一个不错的选择。您也可以将其编译为 64 位 - 不是最好的解决方案 - 只是说:-)

标签: c# xml xmlreader xelement


【解决方案1】:

以前建议使用 SAX 解析器的 cmets 是正确的 - 这样您一次获得每个事件(元素等),之后您不必保留任何东西。

如果您绝对确定您的数据与您的示例一样整齐地分成几行,那么一种快速而简单的方法是甚至不解析,而是一次读取一行。处理前两个,然后按照您的意愿分解其余部分,然后处理最后两个。但请务必确保(换句话说,check)每个&lt;Lot&gt; 元素恰好占据一个物理行;正如您可能已经知道的那样,他们必须在一般的 XML 中没有理由这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多