2013-10-04 52 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