我有一个JAVA类,其中我使用DOM解析器实现了XML的解析。解析的XML文件是具有配置参数的配置文件。来自我的网站的任何请求都将根据从此xml文件返回的信息进行重定向。我有2个问题围绕这个
1)我想只对文件进行一次解析而不是每次都进行解析。因为,DOM解析器在我第一次想知道如何检查文件是否已在内存中可用之后将xml加载到内存中?所以每次都不会调用以下内容
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File(sFpath));
2)如果xml文件发生了变化,我如何确保重新加载新的chaged xml文件。
谢谢,
答案 0 :(得分:0)
DOM是一种中间格式 - 在一些特定于应用程序(和友好)的对象结构中解析它,并将其存储在单例中。您不希望为每个Web请求搜索DOM。然后,定期(每x分钟或y个Web请求),检查文件是否已更新,重新解析并更新您的单例。
答案 1 :(得分:0)
文件的读取应该单独实现,我的意思是不与您处理请求的代码一起或者在static initialization block中,然后您可以使用文件观察器来检测文件更改。文件监视的选项:< / p>
答案 2 :(得分:0)
您可以将DOM保留在应用程序内存中,就像任何其他数据一样 - 详细信息取决于您使用的应用程序服务器/框架。但DOM是一个糟糕的选择,不仅仅是因为它笨拙的API,而且因为DOM不是线程安全的,所以所有访问都需要同步。你最好使用一个解析后只读的树模型。考虑使用Saxon和XPath / XQuery - 将树加载到只读的Saxon树中,然后可以使用从Java应用程序调用的XPath或XQuery重复访问它。
根据cdegroot的建议,创建更加明确地表示配置数据的Java类是一种替代方法,但在我看来并不是必需的。每次向配置文件添加内容时,它可能会涉及更多工作。