繁体   English   中英

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

[英]How to use XmlReader to read data in a List Part 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文档中的示例。 没关系 关键是我想将文档放入内存,然后根据需要查询多次,而无需从磁盘访问它并创建另一个阅读器。 是的,我想为此使用阅读器。

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

谢谢你的帮助。

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

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

XmlReader的文档中:

表示一个读取器,该读取器提供对XML数据的快速,非缓存的仅前向访问。

(强调我的。)我在重置周围看不到任何东西,也没想到。

既然您已经在XDocument获得了开始的信息,那么我个人将尝试使用该方法进行所有查询,而不要使用与XmlReader相对较难使用的方法,但是显然这就是您的要求。 但是,如果您给出一些理由,这会有所帮助-正如您所说的那样,您“对此不太熟悉”,因此值得重新考虑您对如何处理更高级别任务的假设。

您是否正在服务器环境(例如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已经在内存中)相比,这是在运行时访问config节的一种甚至更快的方法。 人为的例子如下:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM