我需要解析一个大的XML文件。最佳做法?

时间:2012-02-23 02:26:47

标签: c# xml

我有一个大型XML文件,其结构如下。

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

有几千个肢体元素,每个元素都有子元素。我需要解析这个文件,并以100-200个项目的形式提取肢体元素,并从数据中创建一个新的XML文件。

是否有执行此操作的首选方法?我只知道初级/中级的C#,并且已经使用XML文件工作了一段时间。

我正在考虑编写一个计算肢体元素总数的循环,执行计算以确定我需要的新XML文档的数量(5000个肢体元素/批次200 = = 25个xmldocuments)。从那里我需要读取前200套,将它们复制到一个新文件中,保存它,然后重新开始直到文件结束。

我的逻辑是否有缺陷?

4 个答案:

答案 0 :(得分:2)

如果文档太大而无法加载到内存中,则可以使用XmlReader。您创建自己的XmlReader子类。除非文件大于RAM大小的10-20%,或者你需要快速,否则可能不值得付出额外的努力。

答案 1 :(得分:2)

与Robert链接的Linq-To-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);

答案 2 :(得分:1)

查看Linq-To-XML

答案 3 :(得分: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>