7

解析したい XML ファイルは次で始まります。

<!DOCTYPE plist PUBLIC "-//...//DTD PLIST 1.0//EN" "http://www.....dtd">

そのため、SAX praser を起動すると、オンラインでこの DTD にアクセスしようとすると、java.net.UnknownHostException が発生します。

  1. SAX パーサーにフィードする前に XML ファイルを変更できません
  2. インターネットに接続していなくても実行する必要がある

DTD をロードしないように SAX パーサーの動作を変更するにはどうすればよいですか? ありがとう。

javax.xml.parsers.SAXParserFactory factory = javax.xml.parsers.SAXParserFactory.newInstance();
factory.setValidating(false);

javax.xml.parsers.SAXParser parser = factory.newSAXParser();
parser.parse(xmlFile, handler);
4

4 に答える 4

11

わかりました。このparse()メソッドは、以前に設定されたエンティティリゾルバーを、解析メソッドに渡されたハンドラーでオーバーライドします。次のコードが機能するはずです。

javax.xml.parsers.SAXParserFactory factory = javax.xml.parsers.SAXParserFactory.newInstance();
factory.setValidating(false);
javax.xml.parsers.SAXParser parser = factory.newSAXParser();
parser.parse(new java.io.File("x.xml"), new org.xml.sax.helpers.DefaultHandler(){
        public org.xml.sax.InputSource resolveEntity(String publicId, String systemId)
                throws org.xml.sax.SAXException, java.io.IOException {
            System.out.println("Ignoring: " + publicId + ", " + systemId);
            return new org.xml.sax.InputSource(new java.io.StringReader(""));
        }
    }); 
于 2008-11-17T16:10:03.920 に答える
1

SAXParser の代わりに XMLReader を使用します。

    XMLReader reader =XMLReaderFactory.createXMLReader();
 reader.setEntityResolver(new DummyEntityResolver());
    reader.setContentHandler(handler);
 reader.parse(inputSource);

SAXParser でも動作するはずですが、何らかの理由で動作しません。

于 2011-10-10T13:04:54.833 に答える
0

EntityResolverXML解析中に外部エンティティを検索するために使用されるカスタムを実装できます。

org.xml.sax.EntityResolver customEntityResolver = new DummyEntityResolver();
javax.xml.parsers.SAXParser parser = factory.newSAXParser();
parser.getXMLReader().setEntityResolver(customEntityResolver);
parser.parse(xmlFile, handler);

また、カスタムEntityResolverでは、常にnullを返します。私はそれがこの問題を解決するはずだと思います。

于 2008-11-17T15:20:55.907 に答える
0

問題を解決するには、EntityResolveを提供する必要があります。代わりに、ローカルでDTDを読み取る方法を知っているリゾルバーを作成することをお勧めします(アプリケーションと一緒に出荷されている場合)。それ以外の場合は、Gowriが提案したようにnullを返します。

APIドキュメントを読むことをお勧めします。

yc

于 2008-11-17T15:32:59.923 に答える