Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读取大型XML文件_C#_Xml_File_Parsing_Nodes - Fatal编程技术网

C# 读取大型XML文件

C# 读取大型XML文件,c#,xml,file,parsing,nodes,C#,Xml,File,Parsing,Nodes,我有许多具有以下结构的xml文件 <main.....> <raw...> <A>field 1</A> <B>field 2</B> .... <interval> <type>data</type> <type>data</type> </interval> <interval> <typ

我有许多具有以下结构的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>

字段1
字段2
....
数据
数据
数据
数据
我需要的数据
我需要的数据
我需要的数据
我需要的数据
tsw
我需要的数据
我需要的数据
我需要的数据
我需要的数据
xyz
...
...
对于main中的每个原始节点,我需要来自A和interval2子节点acel、decel、lef的数据,我对XML了解不多。对于每一个原始数据,我都得到了A,但没有更多。

在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);
    }
}
当然,这只是查询它的一种方法——如果没有关于您正在尝试做什么的更多信息,很难给出更具体的答案。

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);
    }
}

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

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

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

多大才算大?100MB?1GB?1TB?你能把整个文件读入内存吗?你没有足够的内存来读入整个文件吗?有多大?100MB?1GB?1TB?您可以将整个文件读入内存吗?您是否没有足够的内存来读取整个文件?我注意到LINQ to XML在解析非常大的XML文件(比如200 KB或更大)时可能非常慢。但这很简单@KevinR:200K不是很大——我肯定没有看到这种行为。有推荐信吗?哇!试试16MB(50万行)。看错了文件。我为每天的空气污染数据创建了一个XML存储,解析这些数据需要很长的时间,我觉得速度很慢。大量的
TryParse
内容用于枚举和空值。如果文件真的很大,这可能不是正确的方法,因为它可能会涉及大量内存读取。(这就是为什么我问OP他认为“大”有多大。)如果文件太大,可能需要更基于流的方法,代码告诉我:未处理的异常:System.NullReferenceException:Object reference未设置为对象的实例。我注意到LINQ to XML解析非常大的XML文件(比如200 KB或更大)可能非常慢。但这很简单@KevinR:200K不是很大——我肯定没有看到这种行为。有推荐信吗?哇!试试16MB(50万行)。看错了文件。我为每天的空气污染数据创建了一个XML存储,解析这些数据需要很长的时间,我觉得速度很慢。大量的
TryParse
内容用于枚举和空值。如果文件真的很大,这可能不是正确的方法,因为它可能会涉及大量内存读取。(这就是为什么我问OP他认为“大”有多大。)如果文件太大,可能需要更基于流的方法。实际上,在interval2中,我有不同的类型,代码告诉我:未处理的异常:System.NullReferenceException:对象引用未设置为对象的实例。