我正在学习在JAVA中解析XML文档。但我面临的问题是XML文档太大,我不希望我的程序每次需要查找特定的子节点时解析文档。
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
doc = dBuilder.parse(file);
我应该如何初始化我的doc变量,以便它只解析我的XML文件一次!?
可以在这里使用static
吗?
答案 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)。