Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我需要解析一个大的XML文件。最佳实践?_C#_Xml - Fatal编程技术网

C# 我需要解析一个大的XML文件。最佳实践?

C# 我需要解析一个大的XML文件。最佳实践?,c#,xml,C#,Xml,我有一个具有以下结构的大型XML文件 <tree> <limb> <DATA0> </limb> <limb> <DATA1> </limb> <limb> <DATA2> </limb> </tree> 有几千个肢体元素,每个都有子元素。我需要解析这个文件,并提取

我有一个具有以下结构的大型XML文件

<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读取方式造成任何严重问题。谢谢你提供的信息,看起来应该有用。我今天要试一试。谢谢你提供的信息,看起来应该有用。