Что я должен делать, когда Delphi импортирует WSDL неправильно из-за дефиса в имени перечисления?

#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 и обновление импортера

http://cc.embarcadero.com/Item/24535

Комментарии:

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?