2

好吧,看来我有这个问题的答案,但我错了。可能是因为我问错了。这是我想要做的:我想获取一个 xml 文档并将其拉入内存。然后,我想随意对该文档运行查询并从中获取信息。每当我需要数据而不将文档再次加载到内存中时,我都想这样做。毕竟,关键是在我需要数据时停止访问磁盘。我一直使用的方法只能工作一次,我需要多次这样做。这是我尝试过的代码:

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语句放在一个方法中,并创建其他人来做特定的查询,并在我需要信息的时候调用它们。但它只能工作一次。

正如我所说,我对此并不太熟悉,所以可能有一种简单的方法。

此外,另一个线程中的人想要一个关于 xml 文档中内容的示例。那是无关紧要的。关键是我想将文档放入内存,然后根据需要多次查询它,而无需从磁盘访问它并创建另一个阅读器。是的,我想为此使用阅读器。

也许我需要将内存中文件中的指针移回顶部,以便再次读取它?

谢谢你的帮助。

4

2 回答 2

1

为什么不想创建另一个阅读器?

GrabFile.configData.CreateReader()每次需要时调用它是最简单的方法。(这不会再次从磁盘加载它,但每次调用它都会创建一个单独的。)XmlReader

从文档中XmlReader

表示提供对 XML 数据的快速、非缓存、只进访问的读取器。

(强调我的。)我没有看到任何关于重置的东西,我也不希望这样做。

鉴于您已经获得了XDocument开始的信息,我个人会尝试使用该信息进行所有查询,而不是使用更难使用的方法XmlReader,但显然这是您的决定。但是,如果您提供一些理由会有所帮助-正如您所说,您“对此并不太熟悉”,因此值得重新审视您对如何处理更高级别任务的假设。

于 2012-07-27T16:37:05.220 回答
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;
    }
}
于 2012-07-27T16:40:44.937 回答