Java:如何防止'systemId'在EntityResolver#resolveEntity(String publicId,串systemId)从被absolutized当前的工作目录

StackOverflow https://stackoverflow.com/questions/1648291

我想分析下列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())的),但是 systemIdMyEntityResolver#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设置为东西你可以住在一起,或用它代替系统标识的公共标识。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top