在数据库输出中处理非法字符<0x1A>

时间:2019-06-07 18:48:30

标签: scala

我正在研究一个数据转换管道,该管道将从Oracle SQL关系数据库读取数据,将其写入RDF三元存储,然后将其拉入JVM内存。原始数据库包含一些单元格,这些单元格的字符串值以Unicode字符开头,有时表示为<0x1a>U+001A。这可能是错误地在数据库中,但是我无法控制该数据库,因此必须按原样进行处理。我也不能修改字符串,因为它们后来被用作从数据库中其他表中查找信息的主键(是的,我知道这并不理想)。我正在Windows上工作。

包含此字符的单元格映射到三元组中的文字值。尝试从三元存储中提取并遍历数据时,由于存在非法字符,我收到以下错误:

error:org.eclipse.rdf4j.query.QueryEvaluationException: 
org.eclipse.rdf4j.query.QueryEvaluationException: 
org.eclipse.rdf4j.query.resultio.QueryResultParseException: 
org.xml.sax.SAXParseException; lineNumber: 1085; columnNumber: 14; An 
invalid XML character (Unicode: 0x1a) was found in the element content of 
the document.

如果有意思的话,下面是我用来从三元组迭代结果的代码:

val cxn = getDatabaseConnection()
val query = getTriplestoreQuery()
val tupleQueryResult = cxn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate()
// fails at this line when illegal XML character is discovered
while (tupleQueryResult.hasNext()) 
{
      // do some stuff with the data
}

我有点挣扎,因为我必须找到一种方法来将这些数据拉入内存,而无需修改字符串(因为它们当前存在于数据库中)。我还没有找到针对这种情况的转义解决方案。我的最后一招是捕获QueryEvaluationException,并且根本不处理损坏的字符串,但是最好能够挽救这些数据。

0 个答案:

没有答案