Java:如何防止'systemId'在EntityResolver#resolveEntity(String publicId,串systemId)从被absolutized当前的工作目录
-
22-07-2019 - |
题
我想分析下列XML文件解决的所有实体在它:
<!DOCTYPE doc SYSTEM 'mydoc.dtd'>
<doc>&title;</doc>
我EntityResolver应该获取外部实体给予系统的标识数据库,然后执行该决议,见下文说明:
private static class MyEntityResolver
{
public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException
{
// At this point, systemId is always absolutized to the current working directory,
// even though the XML document specified it as relative.
// E.g. "file:///H:/mydoc.dtd" instead of just "mydoc.dtd"
// Why??? How can I prevent this???
SgmlEntity entity = findEntityFromDatabase(systemId);
InputSource is = new InputSource(new ByteArrayInputStream(entity.getContents()));
is.setPublicId(publicId);
is.setSystemId(systemId);
return is;
}
}
我想既使用DOM(DocumentBuilder)和萨克斯(。),集体解决MyEntityResolver(即 setEntityResolver(new MyEntityResolver())
的),但是 systemId
在 MyEntityResolver#resolveEntity(String publicId, String systemId)
总是被absolutized目前的工作目录。
我也试着打电话给 setFeature("http://xml.org/sax/features/resolve-dtd-uris", false);
, 但这并没有什么帮助。
所以我怎么可以实现什么我想要的吗?
谢谢!
解决方案
显然,还有另外一个界面叫 EntityResolver2 这是延长老 EntityResolver.(谈混乱的名字!)
无论如何,我发现, EntityResolver2
取得了什么我想要的,也就是说,它并不作任何改变的 systemId
, ,因此它将始终究竟是什么,被指定在XML文件。
其他提示
从所述的EntityResolver Javadoc中一个>:
如果系统标识符是一个URL,则 SAX解析器必须完全解决它 其报告给前 应用
此外,有机xml.sax文档有这样说的决心,DTD-URI的特点:
它并不适用于 EntityResolver.resolveEntity(),它 不用于报告声明...
我认为你要么有你的基地-URI设置为东西你可以住在一起,或用它代替系统标识的公共标识。