Ошибка Недопустимый символ XML

Эта ошибка никогда не появлялась. Почему я получаю эти ошибки и как их исправить?

Симптомы

Я сохраняю данные элемента или запускаю 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. Это может произойти в следующих случаях:
  1. Ввод данных в систему (например, запись данных в интерфейсе пользователя или импорт заданий).
  2. Выполнение сценариев (например, $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. Недопустимые атрибуты могут оказаться в файле фида или остаться в базе данных из предыдущих версий.
Ниже описано несколько способов обнаружения:
  1. Откройте элемент и найдите в атрибутах недопустимые символы.
  2. Найдите атрибут методом проб и ошибок. Удалите атрибут и сохраните элемент. Если вы получите ту же ошибку, то это значит, что атрибут был правильным, и его нужно вставить обратно. Повторяйте этот процесс, пока не будет сохранен правильный элемент; последний удаленный атрибут - это неправильный атрибут.
  3. Используйте следующий сценарий, чтобы распечатать элемент, просмотреть его и найти атрибуты, которые могут содержать недопустимые символы:

    var ctg;
    ctg = getCtgByName("Catalog_Name");
    if(ctg != null)
    {
         out.writeln(ctg1.getEntryByPrimaryKey("pk1"));
         out.writeln(ctg1.getEntryByPrimaryKey("pk2"));
         ....
    }

  4. Можно также использовать для обнаружения недопустимых символов инструмент XML стороннего поставщика.
Чтобы исправить атрибут, можно сделать следующее:
  1. Откройте элемент в интерфейсе пользователя, удалите из атрибута неправильный символ и сохраните элемент.
  2. Используйте SQL, WQL или сценарий, чтобы удалить значение атрибута и задать значение NULL.
  3. Если элементов много, то создайте задание экспорта, чтобы экспортировать значения всех элементов. Затем измените неправильные значения атрибутов и импортируйте эти значения при помощи файла фида или задания импорта.


Последнее изменение: 23 октября 2014