#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();
}