【问题标题】:Reading large XML file读取大型 XML 文件
【发布时间】:2012-01-24 19:12:56
【问题描述】:

我有许多具有以下结构的 xml 文件

<main.....>
 <raw...>
  <A>field 1</A>
  <B>field 2</B>
  ....
  <interval>
   <type>data</type>
   <type>data</type>
  </interval>
  <interval>
   <type>data</type>
   <type>data</type>
  </interval>
  <interval2>
   <acel>data i need</acel>
   <decel>data i need</decel>
   <left>data i need</left>
   <right>data i need</right>
   <range>tsw</range>
  </interval2>
  <interval2>
   <acel>data i need</acel>
   <decel>data i need</decel>
   <left>data i need</left>
   <right>data i need</right>
   <range>xyz</range>
  </interval2>
 </raw>
 ...
 </raw>
 <raw>
 ...
 </raw>
</main>

我需要来自 A 的数据,以及间隔 2 的子节点 acel、decel、lef、right 用于 main 中的每个原始节点,我对 XML 不太了解。我已经到了每一个 raw 都得到 A 的地方,但没有进一步了。

【问题讨论】:

  • 多大是多大? 100MB? 1GB? 1TB?能不能把整个文件读入内存,是不是内存不够读入整个文件?

标签: c# xml file parsing nodes


【解决方案1】:

C# 中最简单的方法(如果您使用 .NET 3.5 或更高版本)是使用 LINQ to XML:

XDocument doc = XDocument.Load("file.xml");
var query = doc.Descendants("raw")
               .Select(raw => new {
                           A = (string) raw.Element("A"),
                           Interval2 = raw.Element("interval2")
                                          .Elements("type2")
                                          .Select(type2 => (string) type2)
                                          .ToList()
                       });

foreach (var item in query)
{
    Console.WriteLine("A: {0}", item.A);
    Console.WriteLine("Interval2 values:");
    foreach (var x in item.Interval2)
    {
        Console.WriteLine("  {0}", x);
    }
}

当然,这只是查询它的一种方式 - 如果没有更多关于您正在尝试做什么的信息,很难给出更具体的答案。

【讨论】:

  • 我注意到 LINQ to XML 在解析非常大的 XML 文件(比如 200 KB 或更多)时会非常慢。但这很简单!
  • @KevinR:200K 不是非常大 - 我绝对没有看到这种行为。有参考吗?
  • 哎呀!尝试 16 MB(半百万行)。看错文件了。我为每日空气污染数据创建了一个 XML 存储,解析需要好几秒钟,我觉得这很慢。很多 TryParse 用于枚举和可空值的东西。
  • 如果文件真的很大,这可能不是正确的方法,因为它可能涉及到大量读取内存。 (这就是为什么我向 OP 询问他认为“大”有多大。)如果文件太大,可能需要更基于流的方法。
  • 实际上在 interval2 中我有不同的类型,代码给了我:未处理的异常:System.NullReferenceException:对象引用未设置为对象的实例。
【解决方案2】:

最简单的方法是使用 XmlDocument。但是,这会将整个文件读入内存,因此不适用于非常大的文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多