首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java:如何防止EntityResolver#resolveEntity(String publicId,String systemId)中的'systemId‘被绝对化到当前工作目录

Java:如何防止EntityResolver#resolveEntity(String publicId,String systemId)中的'systemId‘被绝对化到当前工作目录
EN

Stack Overflow用户
提问于 2009-10-30 14:18:12
回答 2查看 5.3K关注 0票数 8

我想解析下面的XML文档,以解析其中的所有实体:

代码语言:javascript
运行
复制
 <!DOCTYPE doc SYSTEM 'mydoc.dtd'>
 <doc>&title;</doc>

我的EntityResolver应该从数据库中获取具有给定系统ID的外部实体,然后执行解析,如下图所示:

代码语言:javascript
运行
复制
 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)和SAX (XMLReader),将实体解析器设置为MyEntityResolver (即setEntityResolver(new MyEntityResolver())),但MyEntityResolver#resolveEntity(String publicId, String systemId)中的systemId总是被绝对化为当前工作目录。

我也试着给setFeature("http://xml.org/sax/features/resolve-dtd-uris", false);打电话,但没有任何帮助。

那么,我如何才能实现我想要的呢?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-03 09:25:14

显然,还有另一个名为EntityResolver2的接口,它是旧EntityResolver的扩展。(说到容易混淆的名字!)

无论如何,我发现EntityResolver2实现了我想要的,也就是说,它不会对systemId进行任何更改,所以它始终是文档中指定的内容。

票数 8
EN

Stack Overflow用户

发布于 2009-10-30 14:42:31

来自the EntityResolver Javadocs

如果系统标识符是一个URL,则SAX解析器必须在将其报告给应用程序之前完全解析它。

此外,org.xml.sax docs对resolve-dtd-uris特性也有这样的说法:

它不适用于EntityResolver.resolveEntity(),它不用于报告声明...

我认为您要么将base-URI设置为您可以接受的内容,要么使用public-IDs而不是system-IDs。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1648291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档