仅在JAVA中解析XML文件一次

时间:2014-01-29 07:17:01

标签: java xml xml-parsing

我正在学习在JAVA中解析XML文档。但我面临的问题是XML文档太大,我不希望我的程序每次需要查找特定的子节点时解析文档。

 DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
 DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
 doc = dBuilder.parse(file); 

我应该如何初始化我的doc变量,以便它只解析我的XML文件一次!? 可以在这里使用static吗?

3 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点,静态肯定是一种选择:

static final Document doc;

static {
   DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
   DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
   doc = dBuilder.parse(file); 
}

此代码定义了一个静态最终变量来保存文档,然后使用静态初始化程序块来实际设置它。将它放在任何类中,它将为您创建并初始化doc变量。

答案 1 :(得分:0)

您可以使用静态字段,以便在初始化不同的线程/实例之后共享文档。

请注意,DOM使用额外的内存进行文档操作。您可能更喜欢使用表示XML数据的POJO对象的SAX解析器。

为了性能和可测试性,您还应该考虑使用具有延迟初始化或对象缓存的单例。

答案 2 :(得分:0)

使用静态声音通常是一个非常糟糕的主意:这意味着您的大型文档将在JVM的持续时间内锁定在内存中。如果您想重复使用该文档,这表明您可能在某种长期运行的服务器中,并且您不想关闭服务器,例如,如果文档已更新。

更好的解决方案是维护某种缓存,其中文档保存在实例数据中,符合垃圾收集条件。如何执行此操作取决于您使用的Java框架类型。

顺便说一句,你真的必须使用DOM吗?它慢,大,丑。 Java世界中有许多更好的XML树模型,例如JDOM和XOM。 (就此而言,您是否必须使用Java?有更好的语言来处理XML,例如XSLT和XQuery)。