#xml #delphi #class #proxy #wsdl
#xml #delphi #класс #прокси #wsdl
Вопрос:
Я использую Delphi и файл wsdl от другой компании, чтобы настроить свой прокси-класс для использования их данных из их веб-службы. Файл wsdl содержит следующее:
<xsd:simpleType name="departStatus">
<xsd:annotation>
<xsd:documentation>Enumerates allowable departure statuses (DEPARTED, NOT-DEPARTED)</xsd:documentation>
</xsd:annotation>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="DEPARTED"/>
<xsd:enumeration value="NOT-DEPARTED"/>
</xsd:restriction>
</xsd:simpleType>
Когда я генерирую прокси-класс, я получаю следующее:
departStatus = (
DEPARTED,
[System.Xml.Serialization.XmlEnumAttribute('NOT-DEPARTED')]
NOTDEPARTED);
Который не компилируется, пока я не удалю строку, начинающуюся с [System.xml …, и он не распознает «НЕ ОТПРАВЛЕННЫЙ» как допустимое значение для departStatus. Если я изменю «NOT-DEPARTED» на «NOT_DEPARTED» в файле wsdl и любом входящем xml-файле, все будет работать нормально, но компания, которая это установила, настаивает на том, что «NOT-DEPARTED» является допустимым и не будет его менять. Почему не выполняется правильная настройка перечисления departStatus? Есть идеи, как это обойти? Заранее спасибо за любую помощь.
Комментарии:
1. Какую версию delphi вы используете?
2. @RRUZ: этот вопрос был помечен
.net
ранее 🙂3. @mjn, в op говорится
I'm using Delphi and I'm using a wsdl file...
4. Можете ли вы предоставить ссылку на WSDL?
5. @RRUZ: кто-то, использующий учетную запись RRUZ, удалил
.net
тег — посмотрите на исходный код, это явно не Delphi Win32
Ответ №1:
У меня есть возможный обходной путь:
Поскольку departStatus
имеет базовый тип xsd:string
, вы должны иметь возможность изменять все вхождения departStatus
типа на xsd:string
в файле WSDL.
Таким образом, вы можете передавать / интерпретировать строку 'DEPARTED'
или 'NON-DEPARTED'
вместо использования перечисления.
Комментарии:
1. Не могли бы вы подробнее рассказать о том, как я бы это сделал, я совсем новичок в работе с XML-файлами. Какие изменения я должен внести в код прокси-класса?
2. Я бы не стал изменять сгенерированный код, я бы предпочел изменить файл wsdl. Найдите все вхождения
departStatus
и замените их наxsd:string
, затем удалите фрагмент кода, который вы указали в своем вопросе, из файла wsdl. Тогда код прокси-сервера должен иметь тип string вместо типа enum.3. Бинго! Сработало как по волшебству! Это «обходной путь», но он делает свое дело. Я у тебя в большом долгу.
Ответ №2:
Среда выполнения Delphi SOAP и обновление импортера
Комментарии:
1. Я попробовал это, и, предполагая, что я установил это правильно, это не имело никакого значения.
2. @Bob, это не заменяет импортера wsdl в ide. Вы должны использовать загруженный wsdlimp.exe из командной строки (пока не беспокойтесь ни о каких аргументах командной строки).
Ответ №3:
Если среда выполнения Delphi (.Net) не поддерживает дефисы в именах перечислений, я бы создал базовое тестовое приложение с использованием Visual Studio и C #, чтобы выяснить, работает ли оно там. В зависимости от результата я бы подумал о написании службы «прокси», которую можно использовать из Delphi (.Net). Если поддержка веб-службы C # завершается с той же ошибкой, то в качестве последнего средства прокси Java может быть вариантом.
Еще одна идея: отфильтровать данные HTTP веб-запроса / ответа и преобразовать написание «на лету».
Комментарии:
1. Я использую Delphi 2005, и ниже приведена ссылка на ZIP-файл, содержащий файлы wsdl и xml: mimosa.iom.int/confluence/download/attachments/51839154 /…
2. Я бы попробовал Delphi 2007 (.Net), если бы мог получить копию. Возможно, там исправлена поддержка Soap.
3. Можете ли вы предоставить подробную информацию о том, как вы будете «фильтровать HTTP-данные ответа и преобразовывать написание на лету»? Я новичок в обработке xml и не знаю, как это сделать.
4. Это Delphi или Delphi .Net 2005?