Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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文件,其中包含超过50000条记录(未来的记录可能多达500000条)。每个记录有3个级别—主级别(用于区分记录)、公共数据级别(标记包含定义每个记录的属性),第三个级别包含每个记录的特定数据(主要作为属性,但有时作为内部文本)。我的任务是将这个文件“分解”成多个较小的文件。第三级有一个属性,确定整个记录属于哪个组 算法应该是这样的: 对于文件中的每条记录: 读取包含确定记录所属组所需信息的属性(这很简单,我解决了这一部分) 将整个记录(每个级别的每个字母)复制到相应的文件中

我有一个XML文件,其中包含超过50000条记录(未来的记录可能多达500000条)。每个记录有3个级别—主级别(用于区分记录)、公共数据级别(标记包含定义每个记录的属性),第三个级别包含每个记录的特定数据(主要作为属性,但有时作为内部文本)。我的任务是将这个文件“分解”成多个较小的文件。第三级有一个属性,确定整个记录属于哪个组

算法应该是这样的:

对于文件中的每条记录:

  • 读取包含确定记录所属组所需信息的属性(这很简单,我解决了这一部分)
  • 将整个记录(每个级别的每个字母)复制到相应的文件中
所以我的问题是,将数据复制到新文件中最简单(也是最有效)的方法是什么?请记住,我需要复制整个记录,而不仅仅是一些特定的数据。我使用VS 2010在C#中工作。

您可以使用a在源文件的节点之间进行处理,一旦遇到满足您要求的节点,只需读取它并复制到新文件(当前节点的
InnerXml
属性将为您提供可存储到新文件的整个字符串表示形式)

顺便说一句,如果您希望XML增长到数百万条记录的大小,我建议您提前预测这种增长,并切换到更适合处理此类数据量的数据库。

最有效的方法(关于性能)是使用单个
XmlReader
实例,检查你的大文件。 由于有多个组可以作为目标,因此应该有多个
XmlWriter
实例,您可以根据需要创建这些实例,并将其存储在按“组键”索引的字典中,以供下一次迭代使用

使用
XmlReader
XmlWriter
可以避免将整个文件加载到内存中

要跟踪所经过的嵌套级别,可以使用
堆栈
,向内导航时推送项目,向外导航时弹出项目,或者只使用方法中的局部变量


完成后不要忘记关闭
实例。

通过
System.Xml
可以执行该操作。创建
列表
,并涵盖每个列表的三个级别

   XmlDocument doc = new XmlDocument();
      doc.Load("Test.xml");
      XmlElement root = doc.DocumentElement;
    //Preform your read and write operation here
     doc.Save("Test.xml");

这跳过了第一级。我需要复制整个记录。
InnerXml
只获取第二级和第三级,而不获取第一级。然后,您必须存储对该顶级的引用(作为局部变量)。一旦遇到所需的节点,只需将其设置为变量。当以后满足条件时,重用此引用并对其调用InnerXml。如果您能提供XML的结构,应该可以构造一个XSLT文件来完成此操作。