Delphi, мыло и оберточные значения в cdata - PullRequest
3 голосов
/ 22 сентября 2010

Мы импортировали wsdl от третьей стороны.Это дает нам набор интерфейсов с методами для вызова и классами для параметров и возвращаемых значений.

Теперь, третья сторона сказала нам, что одно из самых широких значений, которые мы передаем, должно быть заключено в раздел CData.

В Delphi 2007 есть способ управления тем, как данное свойство преобразуется в xml в мыльном запросе, чтобы мы могли контролировать, закодировано ли значение или нет, и если значение должно быть упаковано вcdata-section или нет?

Или мы контролируем это либо путем кодирования значения, либо без него, и упаковываем значение сами?

С уважением, -Вегар

Ответы [ 2 ]

2 голосов
/ 23 сентября 2010

Разделы Cdata - это просто символьные значения, которые не требуют обычного экранирования XML.Например, вы можете иметь буквальный символ < вместо экранирования с помощью &lt;.Это все, что есть Cdata.Если продавец сказал, что значение должно быть в разделе Cdata, то я вижу две возможности:

  1. Продавец не понимает, что означает Cdata.Во время тестирования они, вероятно, всегда помещают свои собственные вещи в разделы Cdata, потому что людям легче читать и писать, но они не понимают, что парсер XML на самом деле не заботится.
  2. Парсер XML, который поставщикИспользование не соответствует спецификации, и поэтому обрабатывает значения из разделов Cdata, отличные от разделов с открытым текстом.

Если это первое, игнорируйте инструкции поставщика и продолжайте создавать обычные текстовые узлы с вашим XMLбиблиотека.Сериализатор библиотеки будет экранировать символы, которые должны экранироваться автоматически.

Но если это последнее, то вы должны сообщить продавцу, что его система сломана.Если он не может правильно обрабатывать Cdata, что еще он делает не так?Если ваш продавец не очень отзывчив, думаю, вам не повезло.С Delphi SOAP вы не контролируете, как генерируется XML.Вы не предоставляете IDomDocument, поэтому вам не нужно вызывать createCdataSection для управления структурой запроса, который отправляет ваша программа.

2 голосов
/ 22 сентября 2010

Никогда не делайте XML как строковые литералы, так как это обычно не срабатывает где-то в будущем, особенно когда ваши данные сами содержат символы, которые нужно как-то экранировать.

Вам необходимо использовать класс TDomCDATASection для чеготы хочешь.Это оболочка Delphi для CDATASection XML DOM ( DOMCDATASection ).

Пример использования его для хранения данных в кодировке Base64: здесь .

Обратите внимание, что вам необходимо согласовать набор символов и формат необработанных байтов (старшего, младшего, 8-битного, 16-битного и т. д.) ваших строковых данных, чтобы вы моглисделать правильную кодировку base64.

Редактировать:

Для вставки CDATA в ваш ответ SOAP необходимо перейти к металлу.

ЕстьМожно попробовать несколько способов:

  1. Создать потомка методов TOPToSoapDomConvert
  2. Переопределить TSOAPDomConv.ConvertNativeDataToSoap или TOPToSoapDomConvert.MakeResponse в своем потомке
  3. Назначить экземплярвашего TOPToSoapDomConvert потомка к свойству Converter вашего THTTPRIO экземпляра

Другой способ может быть таким:

  1. Создать потомка TTypeTranslator
  2. Переопределить TTypeTranslator.CastNativeToSoap
  3. Назначить экземпляр вашего TTypeTranslator потомка переменной TypeTranslator в TypeTrans unэто

Трудно, не идите этим путем, если вам это не нужно.

- jeroen

...