在c#中将大型XML读取为不同节点类型的有效方法

本文关键字:节点 类型 方法 有效 大型 读取 XML | 更新日期: 2023-09-27 18:16:41

我是c#新手。我有一个相对较大的XML文件(28MB),并且正在尝试根据其内容将其子树解析为几种不同的类型。从本质上讲,我有6900多个内容节点,必须对它们进行查询,以确定它们是什么类型。

<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,并将各种数据位连接到另一个系统中的字段,并将相关元素中的数据写入到DB。

由于源文件很大,我想有效地从大文件中拉出子树,上下压缩它们(确定它们的类型),然后将重要的数据(映射它们)写到DB。

我是否必须以某种方式存储这些值并在存储它们之后决定这是哪种类型的对象?

我正在努力使用XmlReader的唯一向前方法和使用基于DOM的方法的便利性。

谢谢你的建议。

= = = = = = =进行编辑谢谢你们的评论。Content节点内部的结构将包含3种模式中的1种。每种类型大约有100个节点,所以为了可读性起见,我没有把它们粘贴进去。我确实试着在上面澄清过。

在c#中将大型XML读取为不同节点类型的有效方法

对于大文件,必须使用xmlreader。我更喜欢使用xmlrereader和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);
                }
            }
        }
    }
}