CAS для XMI -Uima

#uima

#uima

Вопрос:

Когда я пытаюсь преобразовать cas в xmi, я получаю UIMARuntimeException сообщение из-за amp;# 55349″ (недопустимый символ XML). Заранее спасибо.

Исключение:

 Caused by: org.xml.sax.SAXParseException; lineNumber: 190920; columnNumber: 36557; Character reference "amp;#55349" is an invalid XML character.
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.uima.util.XmlCasDeserializer.deserializeR(XmlCasDeserializer.java:111)
at org.apache.uima.util.CasIOUtils.load(CasIOUtils.java:366)
  

Код:

     private static void serialize(CAS cas, File file) throws SAXException, IOException {
    Watch casToXmi = new Watch(Path.getFileName()   "Cas to Xmi Convertion - " file.getName());
    casToXmi.start();
      OutputStream outputStream = null;
      try {
        outputStream = new BufferedOutputStream(new FileOutputStream(file));
        XmiCasSerializer xmiSerializer = new XmiCasSerializer(cas.getTypeSystem());
        XMLSerializer xmlSerializer = new XMLSerializer(outputStream, true);
        xmiSerializer.serialize(cas,xmlSerializer.getContentHandler());
      } catch (FileNotFoundException fnfe) {
        throw new FileNotFoundException(fnfe.getMessage());
      } catch (SAXException saxe) {
        throw new SAXException(saxe.getMessage());
      } finally {
        try {
          outputStream.close();           
        } catch (IOException ioe) {
          throw new IOException(ioe.getMessage());
        }
      }
      casToXmi.stop();
    }   
  

Комментарии:

1. Не похоже, что вопрос связан с Ruta.

Ответ №1:

По умолчанию XMI сериализуется как XML 1.0. XML 1.0 имеет ограниченный диапазон символов, которые он может представлять.

Но у UIMA есть CasIOUtils, которые действительно упрощают запись наших данных:

   out = new FileOutputStream(this.outputFile);
  CasIOUtils.save(cas, out, SerialFormat.XMI_1_1);
  

Кроме того, вы можете настроить сериализатор в своем коде для создания XML 1.1 вместо этого, что может решить вашу проблему:

 XMLSerializer sax2xml = new XMLSerializer(docOS, prettyPrint);
sax2xml.setOutputProperty(OutputKeys.VERSION, "1.1");
  

Эти строки были взяты из XmiWriter ядра DKPro.


Я вижу, что ваш код включает в себя Watch . Если вас беспокоит скорость, то существуют и другие поддерживаемые форматы, которые сохраняются / загружаются значительно быстрее, чем XMI, например, двоичный формат SerialFormat.COMPRESSED_FILTERED_TSI . В отличие от XMI, этот формат также поддерживает любые символы в тексте.

Отказ от ответственности: я являюсь частью проекта Apache UIMA и сопровождающим ядра DKPro.

Комментарии:

1. Спасибо rec. Ваш пост полезен для меня, чтобы решить мою проблему.

Ответ №2:

Я использовал SerialFormat.ДВОИЧНЫЙ файл, который даст простой пользовательский двоичный сериализованный CAS без системы типов, без фильтрации.

 private static void serialize(CAS cas, File file) throws SAXException, IOException {
    Watch casToXmi = new Watch(Path.getFileName()   "Cas to Xmi Convertion - " file.getName());
    casToXmi.start();
      OutputStream outputStream = null;
      try {
        outputStream = new FileOutputStream(file);
        CasIOUtils.save(cas, outputStream, SerialFormat.BINARY);
        
      } catch (FileNotFoundException fnfe) {
        throw new FileNotFoundException(fnfe.getMessage());
      } finally {
        try {
          outputStream.close();
          
        } catch (IOException ioe) {
          throw new IOException(ioe.getMessage());
        }
      }
      casToXmi.stop();
    }