我有一个大型XML文件,其结构如下。
<tree>
<limb>
<DATA0>
</limb>
<limb>
<DATA1>
</limb>
<limb>
<DATA2>
</limb>
</tree>
有几千个肢体元素,每个元素都有子元素。我需要解析这个文件,并以100-200个项目的形式提取肢体元素,并从数据中创建一个新的XML文件。
是否有执行此操作的首选方法?我只知道初级/中级的C#,并且已经使用XML文件工作了一段时间。
我正在考虑编写一个计算肢体元素总数的循环,执行计算以确定我需要的新XML文档的数量(5000个肢体元素/批次200 = = 25个xmldocuments)。从那里我需要读取前200套,将它们复制到一个新文件中,保存它,然后重新开始直到文件结束。
我的逻辑是否有缺陷?
答案 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>