2014-04-20 59 views
0

我想使用APache Tika的MediaType类来比较mediaTypes。正确使用Apache Tika MediaType

我首先使用Tika来检测MediaType。 然后我想根据MediaType开始一个操作。

因此,如果MediaType来自XML类型,我想要执行一些操作,如果它是一个压缩文件,我想启动其他操作。

我的问题是有很多XML类型,所以如何使用MediaType检查它是否是XML?

这里是我以前的(提卡之前)执行:

if (contentType.contains("text/xml") || 
    contentType.contains("application/xml") || 
    contentType.contains("application/x-xml") || 
    contentType.contains("application/atom+xml") || 
    contentType.contains("application/rss+xml")) { 
     processXML(); 
} 

else if (contentType.contains("application/gzip") || 
    contentType.contains("application/x-gzip") || 
    contentType.contains("application/x-gunzip") || 
    contentType.contains("application/gzipped") || 
    contentType.contains("application/gzip-compressed") || 
    contentType.contains("application/x-compress") || 
    contentType.contains("gzip/document") || 
    contentType.contains("application/octet-stream")) { 
     processGzip(); 
} 

我要切换为使用蒂卡类似以下内容:

MediaType mediaType = MediaType.parse(contentType); 
if (mediaType == APPLICATION_XML) { 
    return processXml(); 
} else if (mediaType == APPLICATION_ZIP || mediaType == OCTET_STREAM) { 
    return processGzip(); 
} 

但问题是,Tika.detect( ...)返回许多不具有MediaType常量的不同类型。

如何确定MediaType是否为XML类型?或者如果它是压缩类型? 我需要一个“父亲”类型,其中包括它的所有子元素,可能的方法是: “boolean isXML()”,其中包含application/xml和text/xml以及application/x-xml 或“boolean isCompress() “其中包括所有的zip + gzip类型等。

+0

你能澄清一下你的问题是什么?匹配媒体类型?创建媒体类型对象?确定哪些类型可以回来?处理父类/子类型关系?还有别的吗? – Gagravarr

+0

我编辑了这个问题,并在问题中添加了以下内容(最后一节):如果MediaType是类型XML,我该如何识别它?或者如果是键入压缩? 我需要一个“父亲”类型,其中包括它的所有子元素,可能的方法是: “boolean isXML()”,其中包含application/xml和text/xml以及application/x-xml 或“boolean isCompress() “其中包括所有的zip + gzip类型等 – Chaiavi

回答

4

你需要做的就是遍历类型层次结构,直到你找到你想要的东西或者耗尽了要检查的东西。可以用递归来实现,或者可以用一个循环来完成

你需要的关键方法是MediaTypeRegistry.getSupertype(MediaType)

您的代码会想是这样的:

// Define your media type constants here 
MediaType FOO = MediaType.parse("application/foo"); 

// Work out the file's type 
MediaType type = detector.detect(stream, metadata); 

// Is it one we want in the tree? 
while (type != null && !type.equals(MediaType.OCTET_STREAM)) { 
    if (type.equals(MediaType.Application_XML)) { 
     doThingForXML(); 
    } else if (type.equals(MediaType.APPLICATION_ZIP)) { 
     doThingForZip(); 
    } else if (type.equals(FOO)) { 
     doThingForFoo(); 
    } else { 
     // Check parent 
     type = registry.getSuperType(type); 
    } 
} 
+0

你的答案是有帮助的,但不包括'org.apache.tika.mime.MediaTypeRegistry'的实例化 –

+0

你不应该初始化一个,你从一个[TikaConfig对象](http://tika.apache.org/1.10/api/org/apache/tika/config/TikaConfig.html) – Gagravarr

+0

我们该怎么做? –