2013-04-04 69 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