2013-04-04 66 views
2

我一直在使用XDocument和LINQ to XML来加载xml文件并填充我的类。使用XMLReader读取大型XML文档以将信息解析到类中

但现在我的任务是确保我的程序可以处理所有大小的XML文档,这意味着我需要使用XML读取器,此时我无法绕过操纵XMLReader来填充我的课程。

目前,我有下面的类来填充:

public class DataRecord 
    { 
    private List<Fields> field = new List<Fields>(); 

    public string ID { get; set; } 
    public string TotalLength { get; set; } 

    public List<Fields> MyProperty 
    { 
     get { return field; } 
     set { field = value; } 
    } 

    } 

    internal class Fields 
    { 
    public string name { get; set; } 
    public string startByte { get; set; } 
    public string length { get; set; } 
    } 

} 

我一直在试图switch语句来执行的XMLReader从我这里提供的数据来填充类。例如:

using (XmlReader reader = XmlReader.Create(filename)) 
    { 
    while (reader.Read()) 
    { 
     switch (reader.NodeType) 
     { 
     case XmlNodeType.Element: 
      switch (reader.Name) 
      { 
      case "DataRecord": 
       var dataaa = new dataclass.DataRecord(); 
       break; 
      } 
     break; 
     } 
    } 
    } 

但正如我所说,这是一个例子,我已经寻找年龄,试图找到一个答案,但我越来越糊涂了。希望有人能帮助我们解决我的问题。

+0

你正在尝试创建*一个*你的类的实例,还是大量的实例?单个实例的每个元素是否相当小? (您可以将XmlReader和LINQ结合到XML中,但不知道这些问题的答案,这将很难提供建议。) – 2013-04-04 16:26:15

+1

我几乎可以听到'Jon Skeet' .. .. – MethodMan 2013-04-04 16:26:52

+0

LINQ to XML支持流式传输。请参阅http://msdn.microsoft.com/en-us/library/system.xml.linq.xstreamingelement.aspx – 2013-04-04 19:45:31

回答

5

可以使用XmlReader通过文档移动,但然后加载使用每个元件XElement.

这里的一个简短的例子:

using System; 
using System.Xml; 
using System.Xml.Linq; 

class Test 
{ 
    static void Main() 
    { 
     using (var reader = XmlReader.Create("test.xml")) 
     { 
      while (reader.ReadToFollowing("foo")) 
      { 
       XElement element = XElement.Load(reader.ReadSubtree()); 
       Console.WriteLine("Title: {0}", element.Attribute("title").Value); 
      } 
     } 
    } 
} 

随着样本XML:

<data> 
    <foo title="x" /><foo title="y">asd</foo> <foo title="z" /> 
</data> 

(略不一致只是为了表明它可以处理具有内容的元素,它们之间没有空格的元素以及具有空格的元素他们。)

然后很明显,在循环中,你可以做任何你需要的与XElement - 如果你已经有一种方法从XElement创建你的类的实例,你可以调用它,使用对象,你离开了。

+0

不知道'XElement'支持'Load'!非常酷,谢谢你的提示! – 2013-04-05 12:34:05

+0

@TomW:我很确定在这里有另一种使用'XmlReader'来填充'XElement'的方法 - 但是如果你使用'Load',你需要调用'ReadSubtree'作为'XElement.Load'检查它是否到达'XmlReader'的末尾。 – 2013-04-05 12:38:42