【问题标题】:CAS to XMI -UimaCAS to XMI -Uima
【发布时间】:2021-02-06 18:11:28
【问题描述】:

当我尝试将 cas 转换为 xmi 时,由于 "(无效的 XML 字符),我收到了 UIMARuntimeException。提前致谢。

例外:

Caused by: org.xml.sax.SAXParseException; lineNumber: 190920; columnNumber: 36557; Character reference "&#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();
    }   

【问题讨论】:

  • 这个问题似乎与 Ruta 无关。

标签: uima


【解决方案1】:

我使用了 SerialFormat.BINARY,它将提供没有类型系统、没有过滤的普通自定义二进制序列化 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();
    }

【讨论】:

    【解决方案2】:

    默认情况下,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");
    

    这些行取自 DKPro Core 的XmiWriter


    注意:我看到您的代码包含Watch。如果速度是您关心的问题,那么还有其他支持的格式可以比 XMI 更快地保存/加载,例如二进制格式SerialFormat.COMPRESSED_FILTERED_TSI。不像 XMI 这种格式还支持文本中的任何字符。

    免责声明:我是 Apache UIMA 项目的一员,也是 DKPro Core 的维护者。

    【讨论】:

    • 谢谢推荐。你的帖子对我解决我的问题很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多