4

最上位の要素の名前空間を解析して、調べているXMLファイルの種類を判別する既存のコードがいくつかあります。

XMLEventReader reader = createXMLEventReader(...);
try {
    while (reader.hasNext()) {
        XMLEvent event = reader.nextEvent();
        switch (event.getEventType()) {
            case XMLStreamConstants.DTD:
                // No particularly useful information here?
                //((DTD) event).getDocumentTypeDeclaraion();
                break;

            case XMLStreamConstants.START_ELEMENT:
                formatInfo.qName = ((StartElement) event).getName();
                return formatInfo;

            default:
                break;
        }
    }
} finally {
    reader.close();
}

パーサーがWebからDTDをロードできるようにするgetDocumentTypeDeclaraion()と、関連するすべてのDTDが文字列に挿入されてから渡されるため、処理方法を知っているよりもはるかに多くの情報を含む巨大な文字列が含まれます。一方、WebからDTDをロードするパーサーをブロックすると(明らかな理由から、とにかく望ましい)、文字列、。のみが表示されます"<!DOCTYPE"

DOCTYPE内の値を取り戻す方法はありませんか?

重要な場合に備えて、JREに付属しているデフォルトのパーサーを使用しています。

4

1 に答える 1

3

古い投稿であることは承知していますが、あなたの質問を見つけて正しい方向に導くまで、Web 上で答えを見つけることができませんでした。

ここでは、DTD の外部の解析されていないエンティティは、メソッドによって指定された値をオンにすることによって取得されますXMLEvent#getEventType()

XMLInputFactory factory = XMLInputFactory.newInstance();
factory.setXMLResolver(new XMLResolver() {
    @Override
    public Object resolveEntity(String publicID, String systemID,
            String baseURI, String namespace) throws XMLStreamException {
        //return a closed input stream if external entities are not needed
        return new InputStream() {
            @Override
            public int read() throws IOException {
                return -1;
            }
        };
    }
});

XMLEventReader reader = factory.createXMLEventReader( . . . );
try {
    while(reader.hasNext()) {
        XMLEvent event = reader.nextEvent();
        switch (event.getEventType()) {
            case XMLStreamConstants.DTD:
                List<EntityDeclaration> entities = ((DTD)event).getEntities();
                if (entities != null) {
                    for (EntityDeclaration entity : entities)
                        System.out.println(entity.getName() + " = " + entity.getSystemId());
                }
                break;
            case . . .
        }
    }
} finally {
    reader.close();
}
于 2016-12-12T16:09:51.157 に答える