如何使用XmlReader读取列表第2部分中的数据

时间:2012-07-27 16:31:55

标签: c# xml

好吧,似乎我对这个问题有了答案,但我错了。可能是因为我问错了。这是我想要做的: 我想拿一个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文档中的内容示例。那是无关紧要的。关键是我想将文档放入内存,然后根据需要多次查询,无需从磁盘访问它并创建另一个读取器。是的,我想用读者来做这件事。

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

感谢您的帮助。

2 个答案:

答案 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;
    }
}