2015-11-24 29 views
0

基本上,我解析Apache Tika的几个XML输出以获取元数据(通过元标记)和使用<div class="embedded" id="content">的嵌入文件列表。不过,我发现我的地图有几个关键Unknown tag (0x...)。我不知道它是否由Tika的不完整标签输出引起的,因为我得到的错误只与未关闭的标签有关 - 我怀疑它是XML的主体而不是我想要的输出(meta,div)。然而,只有写入地图的代码是元标签和div(嵌入类) - 这只是文档的一小部分,这是非常不合逻辑的。解析Apache Tika XML输出返回未知标记

public class Parse { 
    private class internalXMLReader extends DefaultHandler{ 
     public final Map<String, Object> entityList = new HashMap<>(); 

     @Override 
     public void startElement(String uri, String localname, String qName, Attributes attributes) throws SAXException{ 
      String key, content; 
      if(qName.equalsIgnoreCase("meta")){ 
       key = attributes.getValue("name"); 
       content = attributes.getValue("content"); 
       if(key.contains("Content-Type")){ 
        String tmp[] = attributes.getValue("content").replace(' ', '\0').split(";"); 
        if(tmp.length > 1){ 
         content = tmp[0]; 
        } 
       } 
       entityList.put(key, content); 
      } 
      else if(qName.equalsIgnoreCase("div")){ 
       if((attributes.getValue("class") != null) && (attributes.getValue("class").equalsIgnoreCase("embedded"))){ 
        key = "embedded"; 
        List<String> inlist; 
        if(entityList.containsKey("embedded") && (entityList.get("embedded") instanceof List)){ 
         inlist = (List) entityList.get(key); 
        } 
        else{ 
         inlist = new LinkedList<>(); 
         entityList.put(key, inlist); 
        } 
        inlist.add(attributes.getValue("id")); 
       } 
      } 
     } 

     @Override 
     public void endElement(String uri, String localname, String qName) throws SAXException{ 
      //no, i just did not want to validate or such.. 
     } 

     @Override 
     public void characters(char ch[], int start, int length) throws SAXException{ 
      //no, we don't actually read <something>this</something> yet 
     } 
    } 
    public Entity parse(String xml, Entity in){ 
     try{ 
      InputSource xmlinput = new InputSource(new StringReader(xml)); 
      SAXParserFactory factory = SAXParserFactory.newInstance(); 
      SAXParser parser = factory.newSAXParser(); 
      internalXMLReader handler = new internalXMLReader(); 
      parser.parse(xmlinput, handler); 
      in.addMeta(handler.entityList); 
     } 
     catch(IOException | ParserConfigurationException | SAXException ex){ 
      Logger.getLogger(TikaParseNCluste.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return in; 
    } 
} 

也许我应该看看我的800多个xml文件。

回答

0

谷歌和javadocs没有关于这件事的信息,我很不耐烦。然而运行grep -i -l -r "name=\"unknown" .我得到了几个jpg文件有<meta name="Unknown..." contents="..."/>也许这就是为什么。我不希望ApacheTika会提供这样的输出。所以,我改变我的代码:

... 
if(qName.equalsIgnoreCase("meta") && (attributes.getValue("name") != null)){ 
       key = attributes.getValue("name"); 
       if((key != null) && (!key.contains("Unknown"))){ 
        content = attributes.getValue("content"); 
        if(key.contains("Content-Type")){ 
         String tmp[] = attributes.getValue("content").replace(' ', '\0').split(";"); 
         if(tmp.length > 1){ 
          content = tmp[0]; 
         } 
        } 
        entityList.put(key, content); 
       } 
      } 
... 

我不知道它是一个错误还是别的。到目前为止,快速查询Google搜索关键字apache tika未知标签只能引导我到这里。