Эта ошибка никогда не появлялась. Почему я получаю эти ошибки и как их исправить?
Симптомы
Я сохраняю данные элемента или запускаю
migrateDataToXml.sh и получаю ошибку Недопустимый символ XML.
Причины
Начиная с версии 10.0.0 Fix Pack 1,
IBM® InfoSphere Master Data Management Collaboration
Server использует для хранения данных элемента в базе данных формат XML. В XML используются универсальные стандарты, и он поддерживает
только определенный набор символов Unicode:
http://en.wikipedia.org/wiki/Valid_characters_in_XMLЕсли
вы пытаетесь сохранить элемент с недопустимым символом XML в одном из атрибутов, то приложение не может сохранить этот атрибут элемента в
формате XML. Это может произойти в следующих случаях:
- Ввод данных в систему (например, запись данных в интерфейсе пользователя или импорт заданий).
- Выполнение сценариев (например, $TOP/bin/migration/migrateDataToXml.sh).
Этот сценарий запускается во время перенастройки до любой версии продукта более поздней, чем 10.0.0
Fix Pack 1, чтобы преобразовать все существующие данные в формат XML.
Если этот сценарий обнаруживает во время создания XML недопустимый символ, то он создает примерно следующий стек ошибок:
Error Stack for Oracle:
java.sql.SQLException: ORA-31061: XDB error: XML event error
ORA-19202: Error occurred in XML processing
In line 240 of orastream:
LPX-00217: invalid character 19 (U+0013)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1044)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1329)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3665)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1352)
at com.ibm.ccd.common.util.oracle.OracleUtils.mergeXML(Unknown Source)
at com.ibm.ccd.content.common.EntryXmlProcessor.sendPendingXmlToDb(Unknown Source)
at com.ibm.ccd.common.context.common.DBContext.ensurePendingXMLWrittenToDB(Unknown Source)
at com.ibm.ccd.common.context.common.DBContext.commit(Unknown Source)
at com.ibm.ccd.common.context.common.DBContext.commit(Unknown Source)
Разрешение проблемы
Чтобы исправить эту ошибку, удалите недопустимый символ из
атрибута элемента. Эти символы могут содержаться только в определенных типах атрибутов, поэтому многие типы атрибутов можно игнорировать
(например, целые числа, нумерации, таблицы поиска, последовательности и так далее). Скорее всего, неправильные атрибуты - это строковые
атрибуты, и они могут содержать длинные строки или внешние URL. Недопустимые атрибуты могут оказаться в файле фида или остаться в базе
данных из предыдущих версий.
Ниже описано несколько способов обнаружения:
- Откройте элемент и найдите в атрибутах недопустимые символы.
- Найдите атрибут методом проб и ошибок. Удалите атрибут и сохраните элемент. Если вы получите ту же ошибку, то это значит, что атрибут
был правильным, и его нужно вставить обратно. Повторяйте этот процесс, пока не будет сохранен правильный элемент; последний удаленный
атрибут - это неправильный атрибут.
- Используйте следующий сценарий, чтобы распечатать элемент, просмотреть его и найти атрибуты, которые могут содержать недопустимые
символы:
var ctg;
ctg = getCtgByName("Catalog_Name");
if(ctg != null)
{
out.writeln(ctg1.getEntryByPrimaryKey("pk1"));
out.writeln(ctg1.getEntryByPrimaryKey("pk2"));
....
}
- Можно также использовать для обнаружения недопустимых символов инструмент XML стороннего поставщика.
Чтобы исправить
атрибут, можно сделать следующее:
- Откройте элемент в интерфейсе пользователя, удалите из атрибута неправильный символ и сохраните элемент.
- Используйте SQL, WQL или сценарий, чтобы удалить значение атрибута и задать значение NULL.
- Если элементов много, то создайте задание экспорта, чтобы экспортировать значения всех элементов. Затем измените неправильные
значения атрибутов и импортируйте эти значения при помощи файла фида или задания импорта.