2013-10-04 72 views
0

我正在創建一個Windows Phone應用程序,我需要實現一個相當大的數據庫(由288,000個項目組成),但每當我嘗試運行它時,該程序都會給我一個System.Xml.XmlExceptionXml數據庫不工作

問題是,如果我只將100個或更少的項目放在XML數據庫中,它可以工作,並允許我查詢它。

你知道爲什麼它會這樣嗎?

下面是代碼:

loadCustomData = XDocument.Load("vocabolario.xml"); 

var domanda = from c in loadCustomData.Descendants("Parola") 
       where c.Attribute("id").Value == "1" 
       select c.Attribute("Contenuto").Value; 

lol.Text = domanda.First(); 
+0

可能是當你調用XDocument.Load它將出現一個大文件的內存,因爲XDocument.Load在內存中加載完整文件 –

+1

你應該使用一些像SQLite的數據庫288000項 –

+0

@ Haris Hasan yes yes you are right 。 user1868607應該選擇DB,並且可以通過簡單的查詢檢索數據,而不必在內存中加載整個數據 –

回答

1

從文章喬恩斯基特。

如果您很高興將所有內容讀入內存,請使用XDocument。它會讓你的生活更輕鬆。 LINQ to XML是一個可愛的API。

如果您需要以流方式處理大型XML文件,那麼使用XmlReader(例如XmlTextReader)。這是一個非常痛苦的API,但它允許流式處理(即只處理數據,因此您可以通過一個巨大的文檔,一次只能處理少量內存)。然而,如果您有一個由小元素組成的大文檔,您可以從位於元素開頭的XmlReader創建XElement,使用LINQ to XML處理元素,然後移動將XmlReader放到下一個元素上並重新開始。

Jon Skeet Description

Check the Example below 
    // Create a DOM document with some content. 
    XmlDocument doc = new XmlDocument(); 
    XmlElement child = doc.CreateElement("Child"); 
    child.InnerText = "child contents"; 
    XmlElement root = doc.CreateElement("Root"); 
    root.AppendChild(child); 
    doc.AppendChild(root); 

    // Create a reader and move to the content. 
    using (XmlNodeReader nodeReader = new XmlNodeReader(doc)) { 
    // the reader must be in the Interactive state in order to 
    // Create a LINQ to XML tree from it. 
    nodeReader.MoveToContent(); 

    XElement xRoot = XElement.Load(nodeReader); 
    Console.WriteLine(xRoot); 
} 

這只是一個例子嘗試類似的事情。

+0

實際上,這是一個巨大的文件,它是由一些小元素組成的。 ..你有沒有混合解決方案的例子? – user1868607

+0

@ user1868607請檢查更新。 –

+0

哦!非常感謝! – user1868607