在 C# 中将大 XML 读入不同节点类型的有效方法
Efficient way to read large XML into dfferent node types in C#
我是 C# 新手。我有一个相对较大的 XML 文件 (28MB),我试图根据其内容将其子树解析为几种不同的类型。本质上,我有 6900 多个内容节点,所有这些节点都必须被询问以确定它们是什么类型。
<Collections>
<Content>..</Content>
<Content>..</Content>
<Content>..</Content>
...
</Collections>
对于每个内容节点,其下方的各种节点可以具有 3 种不同模式中的一种。我必须查看节点以决定我正在查看哪个 pattern/type 对象。
所以假设一个 Content 节点中有大约 100 个子节点,第 14 个节点(在一种情况下)中有一个 URL,表明它是一个 "type 1" 并且应该将字段 1、2、3...17、28、47 和 58 写入数据库。
另一种类型具有指示性元素对(假设元素 3 和 58)并表明它是 "type 2" 并且应该具有一组不同的元素写入到数据库。
等等...
从那里,我将对象映射到 CMS/DB 并将各种数据位连接到另一个系统中的字段,并将数据从相关元素写入数据库。
由于源文件很大,我很想有效地从较大的文件中提取子树,将它们压缩(确定它们的类型)然后将重要数据(映射它们)写入数据库
我是否必须以某种方式存储值并在存储它们之后决定这是什么类型的对象?
我正在为 XmlReader 的前向方法和使用基于 DOM 的方法的易用性而苦苦挣扎。
感谢您的建议。
===编辑====
谢谢评论者。 Content 节点内部的结构将包含 3 种模式中的一种。每种类型大约有 100 个节点,因此为了便于阅读,我没有费心粘贴它们。不过,我确实尝试并在上面进行了澄清。
对于大文件,您必须使用 xml阅读器。我更喜欢结合使用 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);
}
}
}
}
}
我是 C# 新手。我有一个相对较大的 XML 文件 (28MB),我试图根据其内容将其子树解析为几种不同的类型。本质上,我有 6900 多个内容节点,所有这些节点都必须被询问以确定它们是什么类型。
<Collections>
<Content>..</Content>
<Content>..</Content>
<Content>..</Content>
...
</Collections>
对于每个内容节点,其下方的各种节点可以具有 3 种不同模式中的一种。我必须查看节点以决定我正在查看哪个 pattern/type 对象。
所以假设一个 Content 节点中有大约 100 个子节点,第 14 个节点(在一种情况下)中有一个 URL,表明它是一个 "type 1" 并且应该将字段 1、2、3...17、28、47 和 58 写入数据库。
另一种类型具有指示性元素对(假设元素 3 和 58)并表明它是 "type 2" 并且应该具有一组不同的元素写入到数据库。
等等...
从那里,我将对象映射到 CMS/DB 并将各种数据位连接到另一个系统中的字段,并将数据从相关元素写入数据库。
由于源文件很大,我很想有效地从较大的文件中提取子树,将它们压缩(确定它们的类型)然后将重要数据(映射它们)写入数据库
我是否必须以某种方式存储值并在存储它们之后决定这是什么类型的对象?
我正在为 XmlReader 的前向方法和使用基于 DOM 的方法的易用性而苦苦挣扎。
感谢您的建议。
===编辑==== 谢谢评论者。 Content 节点内部的结构将包含 3 种模式中的一种。每种类型大约有 100 个节点,因此为了便于阅读,我没有费心粘贴它们。不过,我确实尝试并在上面进行了澄清。
对于大文件,您必须使用 xml阅读器。我更喜欢结合使用 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);
}
}
}
}
}