2010-10-28 6 views
3

Использования Delphi 2009 и IXMLDOMDocument2Delphi, IXMLDOMDocument2, загрузка не удалась из-за недопустимый характер

Я получаю «Недопустимый символ был найдена в текстовом содержимом» ошибка при загрузке XML в IXMLDOMDocument2. Символ 1B (в Hex) и присутствует в секции CDATA. Средство просмотра XML Microsoft (IE) загружает файл просто отлично. XML выглядит ...

<data><child><![CDATA[-- ]]></child></data>

ПРИМЕЧАНИЕ: Я пытаюсь вставить XML, но специальный символ удаляется. В разделе CDATA есть символ 1B, следующий за «-» в моем XML-файле.

Я попытался добавить в начало XML и другие кодировки, и ничто не работает для меня. Есть ли что-то, что можно сделать для загрузки этого файла?

Спасибо, Майкл

ответ

5

символов U + 001B не допускается в XML, along with most of the rest управляющих символов ASCII. Это не очень хорошо, и если Microsoft-просмотрщик Microsoft не жалуется, он не анализирует его в соответствии с правилами XML. Ай!

В XML 1.1 только, все, кроме U + 0000, могут быть включены в документ как ссылка на символ, например &#x1B;. (Очевидно, что это бесполезно в секции CDATA, но тогда разделы CDATA на самом деле не очень полезны.)

Если вам нужно включить произвольные символы управления в XML, вам обычно потребуется использовать кодировку приложения такой как base64.

+0

Спасибо за информацию и ссылку. Этот XML создается Oracle, к сожалению, в одном из своих пакетов. Мы просто пытаемся загрузить его и не имеем никакого контроля над модификацией XML, чтобы он соответствовал спецификациям. –

+0

Ух, как неприятно. Ну, вы можете, конечно, заменить строку '\ x1B' перед подачей на парсер XML. Но действительно, какой бы компонент Oracle не делал этого, нужна ошибка, поданная против него. – bobince

0

Из некоторых веб-сервисов, которые мне нужно вызвать из какого-либо приложения, я получаю много &#x0; символов, загрязняющих XML. Чтобы решить эту проблему, я просто загружаю XML сначала в переменную WideString, а затем заменяю незаконный текст с помощью StringReplace() перед добавлением XML в объект интерфейса IXMLDocument.
Это грязно, я знаю. Но если вам все еще нужно обработать некоторый XML-файл, содержащий недопустимые символы, это просто самый простой вариант.