使用Apache Tika 1.7,如何递归解析zip存档中的文件,直到达到一些递归限制?
递归部分非常重要,因为zip存档可能包含另一个zip存档。
我认为可以使用新的RecursiveParserWrapper
完成,但我在网上找不到任何示例 - Jukka的示例here使用的界面与Tika 1.7提供的界面不同
答案 0 :(得分:1)
理论上,这只是指向Apache Tika Examples page的情况,但现在递归是该页面的only one still to finish。所以,我必须为你抓一个合适的单元测试,然后将其修改为限制
但基本上,您需要的关键类是EmbeddedDocumentExtractor。您需要在ParseContext
上提供相应的实现,并将其用于递归。通常情况下,您可以使用ParsingEmbeddedDocumentExtractor,但由于您需要限制,因此需要自定义
尝试类似:
protected class RecurseWithLimits extends ParsingEmbeddedDocumentExtractor {
protected static final int MAX_DEPTH = 4;
private int depth;
private ParseContext context;
private RecurseWithLimits child;
protected RecurseWithLimits() {
this(0, new ParseContext());
}
private RecurseWithLimits(int depth, ParseContext context) {
super(context);
this.context = context;
this.depth = depth;
}
@Override
public void parseEmbedded(
InputStream stream, ContentHandler handler, Metadata metadata, boolean outputHtml)
throws SAXException, IOException {
if (child == null) {
if (depth >= MAX_DEPTH) {
// Too deep, skip
return;
}
child = new RecurseWithLimits(depth+1);
context.set(EmbeddedDocumentExtractor,child);
}
super.parse(stream,handler,metadata,outputHtml);
}
}
// In main parsing code
Parser parser = new AutoDetectParser();
InputStream inp = TikaInputStream.get(new File("test.zip"));
ContentHandler text = new BodyContentHandler();
ParseContext context = new ParseContext();
context.set(EmbeddedDocumentExtractor, new RecurseWithLimits());
parser.parse(inp, new Metadata(), text, context);