繁体   English   中英

在C#中将大型XML读入不同节点类型的有效方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM