![](/img/trans.png)
[英]most efficient way in c# to parse a large Xml string (to expand DTD references, add new lines etc)
[英]Efficient way to read large XML into dfferent node types in C#
我是C#的新手。 我有一个相对较大的XML文件(28MB),正在尝试根据其内容将其子树解析为几种不同的类型。 本质上,我必须查询6900+个Content节点,以弄清它们是什么类型。
<Collections>
<Content>..</Content>
<Content>..</Content>
<Content>..</Content>
...
</Collections>
对于每个Content节点,其下面的各种节点可以具有3种不同模式中的1种。 我必须查看节点来确定我要查看的对象的模式/类型。
因此,假设一个Content节点中有大约100个子节点,第14个节点(在一种情况下)具有URL,并指出它是“类型1”,并且应具有字段1、2、3,... 17 ,28、47和58写入数据库。
另一种类型具有指示性的元素对(假设元素3和58),并指示它是“类型2”,并且应具有一组不同的元素写入DB。
等等...
从那里,我将对象映射到CMS / DB中,并将各种数据位连接到该其他系统中的字段,并将数据从相关元素写入数据库。
由于源文件很大,所以我想有效地从较大的文件中拉出子树,然后将它们上下压缩(确定其类型),然后将重要数据(映射它们)写入数据库。
我是否必须以某种方式存储这些值,并在存储它们后决定是什么类型的对象?
我为XmlReader的前向方法和基于DOM的方法的简便性而苦苦挣扎。
谢谢你的建议。
===编辑====谢谢评论者。 Content节点内部的结构中将包含3个模式之一。 每种类型中大约有100个节点,因此出于可读性的考虑,我不必理会它们。 我确实尝试过并在上面澄清。
对于大文件,必须使用xmlreader。 我更喜欢使用xmlreeader和xml linq的组合。 尝试以下操作:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XmlReader reader = XmlReader.Create(FILENAME);
while (!reader.EOF)
{
if (reader.Name != "Content")
{
reader.ReadToFollowing("Content");
}
if (!reader.EOF)
{
XElement content = (XElement)XElement.ReadFrom(reader);
}
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.