好吧,似乎我对这个问题有了答案,但我错了。可能是因为我问错了。这是我想要做的: 我想拿一个xml文档并将其拉入内存。然后,我会随意对该文档运行查询并从中获取信息。每当我需要数据而不再将文档加载到内存中时,我想这样做。毕竟,关键是当我需要数据时停止命中磁盘。我一直使用的方法只能使用ONCE,我需要多次这样做。这是我试过的代码:
public static class GrabFile
{
public static XDocument configData = XDocument.Load(@"myxml.xml");
public static XmlReader templateReader = configData.CreateReader();
}
我认为这会将文档复制到内存中,并且我可以使用templateReader随时查询configData:
while (GrabFile.templateReader.Reader())
{
//get the data I wanted
}
我以为我可以把while语句放在那里,并创建其他人在方法中进行特定查询,并在需要信息时调用它们。但它只适用于ONCE。
正如我所说,我对此并不过分熟悉,所以可能有一种方法可以做到这一点很容易。
另外,另一个帖子中的人想要一个xml文档中的内容示例。那是无关紧要的。关键是我想将文档放入内存,然后根据需要多次查询,无需从磁盘访问它并创建另一个读取器。是的,我想用读者来做这件事。
也许我需要将内存中的文件中的指针移回到顶部,以便它再次读取它?
感谢您的帮助。
答案 0 :(得分:1)
为什么你不想创建另一个读者?
每次需要时调用GrabFile.configData.CreateReader()
是最简单的方法。 (这不会再次从磁盘加载它,但每次调用它时将创建一个单独的XmlReader
。)
来自XmlReader
的文档:
代表一个提供对XML数据的快速,非缓存,仅向前访问的读者。
(强调我的。)我没有看到任何重置,我不希望。
鉴于您已经开始使用XDocument
中的信息,我个人会尝试使用它进行所有查询,而不是使用更加努力工作{{1}无论如何,但显然这是你的电话。如果你给出一些理由会有所帮助 - 正如你所说的那样“你并不过分熟悉”,所以值得重新审视你对如何处理更高级别任务的假设。
答案 1 :(得分:0)
您是在服务器环境中执行此操作,例如使用ASP.NET应用程序吗?这可能会引入更多步骤,但一般的想法是使用静态对象来保存加载到内存中的XML文档。就像你做的一样。这就是它的全部内容。你能提供一些更多的背景吗?
您也不需要使用XML阅读器(除非您只想要那种仅向前访问);
public static class Globals
{
public static XDocument ConfigFile = XDocument.Load("C:/somefile.xml");
}
public void SomeOtherFunctionSomewhere()
{
var configName = Globals.ConfigFile
.Descendants("someconfigsection")
.Descendants("configName")
.First().Value;
}
如果要将程序的配置存储在XML文件中 - 请考虑将整个配置读入您在启动时自己创建的内存中对象。这是在运行时访问配置节的一种更快的方法,而不是每次都要查询XML(即使XML已经在内存中)。下面举例说明:
public class Configuration
{
//just some made up config settings
public string Name {get;set;}
public int Id {get;set;}
public int XDimension {get;set;}
public int YDimension {get;set;}
}
class Program
{
static Configuration Config;
static void Main(string[] args)
{
Config = ReadConfig();
}
private static Configuration ReadConfig()
{
var config = new Configuration();
//read entire XML and set properties on the config object
return config;
}
}