因此,我们的应用程序解析从Web服务(特别是PubMed)检索的XML文档.这些文件声明了一个DTD(一个例子).默认情况下,与我天真的期望相反,我们使用的XML库(我相信基于Xerces的JDom2)在解析XML文档之前下载了DTD.下载,就像通过互联网向指定的地址发出HTTP请求一样.
通过阅读其他帖子,我理解读取DTD是必要的,因为它可能包含解析&foo所需的实体声明; 文档中的位(BTW,这是XML标准中的精神错乱,对吧?)
我认为必须有一些简单,标准,任何一个谁知道他们正在做什么 - 这种方式指定我在本地拥有DTD.但是,我所看到的只是提到设置XML目录(黑魔法),或创建自定义EntityResolver(我的屁股很痛苦).
对于我遇到的其他问题,我在Spring或其他Java库中找到了一种克服它们的标准方法,而没有大量的锅炉板.然而,对于这个,我觉得我正在编写相对草率的脆弱代码来完成其他开发人员必须遇到的事情.
如何使用众所周知的库编写XML应用程序,这些应用程序不会反复进行Web请求以获取永不更改的文件?
PS:我发现这个问题是因为PubMed今天早些时候遇到了连接问题,而且我的单元测试(使用基于实际查询的模拟文档)在XML解析器无法检索DTD时失败了.
我能想到的从不同源加载 DTD 的最佳方法是使用 EntityResolver,这应该不会造成太大的麻烦。我使用 EntityResolver for DOM4j 加载本地 xml 资源,并将文件放入我的 jar 中,以便可以使用以下代码轻松访问它。
new org.xml.sax.EntityResolver()
{
@Override
public InputSource resolveEntity(String publicId, String systemId)
{
if (systemId != null && systemId.equals("http://something.com/xml.dtd"))
return new InputSource(getClass().getResourceAsStream("../xml/local.dtd"));;
}
};
Run Code Online (Sandbox Code Playgroud)
我认为这是“标准”方式。
另一种方法可能是通过字符串替换 dtd 引用来修改 xml 文档,并注入可能使用的任何实体引用。
| 归档时间: |
|
| 查看次数: |
336 次 |
| 最近记录: |