8

次のXMLドキュメントを解析して、その中のすべてのエンティティを解決したいと思います。

 <!DOCTYPE doc SYSTEM 'mydoc.dtd'>
 <doc>&title;</doc>

私のEntityResolverは、指定されたシステムIDを持つ外部エンティティをデータベースからフェッチしてから、解決を実行することになっています。図については、以下を参照してください。

 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(ie setEntityResolver(new MyEntityResolver()))に設定しようとしましたが、systemIdinMyEntityResolver#resolveEntity(String publicId, String systemId)は常に現在の作業ディレクトリに絶対化されています。

私も電話をかけてみsetFeature("http://xml.org/sax/features/resolve-dtd-uris", false);ましたが、何の役にも立ちませんでした。

では、どうすれば私が望んでいたことを達成できますか?

ありがとう!

4

2 に答える 2

8

どうやら、古いEntityResolverの拡張であるEntityResolver2と呼ばれる別のインターフェースがあるようです。(紛らわしい名前について話してください!)

とにかく、 は私がEntityResolver2望んでいたことを達成しましsystemIdた。

于 2009-11-03T01:25:13.710 に答える
0

EntityResolver Javadocsから:

システム ID が URL の場合、SAX パーサーはそれをアプリケーションに報告する前に完全に解決する必要があります。

また、org.xml.sax ドキュメントには、resolve-dtd-uris 機能について次のように書かれています。

宣言の報告に使用されない EntityResolver.resolveEntity() には適用されません...

ベース URI を使用できるものに設定するか、システム ID の代わりにパブリック ID を使用する必要があると思います。

于 2009-10-30T06:42:31.277 に答える