C# 我需要解析一个大的XML文件。最佳实践?
我有一个具有以下结构的大型XML文件C# 我需要解析一个大的XML文件。最佳实践?,c#,xml,C#,Xml,我有一个具有以下结构的大型XML文件 <tree> <limb> <DATA0> </limb> <limb> <DATA1> </limb> <limb> <DATA2> </limb> </tree> 有几千个肢体元素,每个都有子元素。我需要解析这个文件,并提取
<tree>
<limb>
<DATA0>
</limb>
<limb>
<DATA1>
</limb>
<limb>
<DATA2>
</limb>
</tree>
有几千个肢体元素,每个都有子元素。我需要解析这个文件,并提取100-200个项中的肢体元素,然后从数据中创建一个新的XML文件
是否有执行此操作的首选方法?我只知道C#的初级/中级水平,并且在XML文件方面工作过一段时间
我正在考虑编写一个循环来计算肢体元素的总数,执行一个计算来确定我需要的新XML文档的数量(5000个肢体元素/批200==25个xmldocuments)。从那里我需要读取前200组,将它们复制到一个新文件中,保存它,然后重新开始,直到文件结束
我的逻辑似乎有缺陷吗?签出。签出。如果文档太大,无法加载到内存中,可以使用XmlReader。您可以创建自己的XmlReader子类。除非文件的大小大于RAM的10-20%,或者您需要它的速度,否则可能不值得付出额外的努力。如果文档太大而无法加载到内存中,您可以使用XmlReader。您可以创建自己的XmlReader子类。除非该文件的大小大于(比如)RAM的10-20%,或者您需要它的速度,否则它可能不值得付出额外的努力。Linq to XML,正如Robert linked所示:
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);
与Robert链接的Linq到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);
如果你是C语言专家,没有时间学习其他东西,那么用C语言写这篇文章可能是一个借口,但事实并非如此,XSLT是一个更好的工具,尤其是XSLT 2.0,因为它可以生成多个输出文件。(有两个XSLT2.0处理器可以在C#环境中使用——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>
如果你是C语言专家,没有时间学习其他东西,那么用C语言写这篇文章可能是一个借口,但事实并非如此,XSLT是一个更好的工具,尤其是XSLT 2.0,因为它可以生成多个输出文件。(有两个XSLT2.0处理器可以在C#环境中使用——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>
< /代码>如果您只需要将XML从一个模式转换为另一个模式,XSLT可能是一个更适合的工作工具。考虑将它作为正常的性能问题来考虑。您在应用程序中使用“大”文件是否真的有问题,那么如果是的话。您所讨论的数字看起来不象用任何内置的读取XML的方式带来严重的问题。如果您只需要将XML从一个模式转换为另一个模式,XSLT可能是一个更合适的工具。考虑将它作为正常的性能问题来解决。您是否真的存在使用“大”的问题?应用程序中的文件,如果是-测量。您所讨论的数字看起来不会对任何内置的XML读取方式造成任何严重问题。谢谢你提供的信息,看起来应该有用。我今天要试一试。谢谢你提供的信息,看起来应该有用。