Ссылки «attributeGroup» игнорируются Delphi WSDL Import Tool - PullRequest
5 голосов
/ 01 июня 2010

Я совершенно новичок в веб-службах, но не новичок в Delphi.

Я импортирую файл WSDL в Delphi 2010 с помощью мастера «Импортер WSDL». Файл WSDL содержит некоторые теги "attributeGroup", которые Delphi полностью игнорирует, что, по-видимому, является ошибкой, хотя я еще не нашел записи по Quality Central для этой проблемы, упоминается только на форумах, таких как здесь и здесь .

Мой вопрос состоит из нескольких частей:

  1. Какой лучший обходной путь?
  2. Я написал скрипт Python для форматирования файла WSDL таким образом, чтобы все ссылки на теги attributeGroup заменялись объявлением атрибутов, определенных в attributeGroups; другими словами, сглаживание ссылок. Вывод успешно импортирован в Delphi с помощью мастера «Импорт WSDL» и выглядит правильно, но мне еще предстоит проверить, будут ли сообщения, созданные с помощью этого нового файла WSDL, работать правильно. Вероятно ли, что эта стратегия будет жизнеспособной, или я должен уйти сейчас и перейти к чему-то еще более продуктивному?

Обновление

Основываясь на своем опыте и ответах на этот вопрос, я решил пойти по пути оболочки с консольным приложением C #, которое ест входные данные JSON и выводит данные ответов JSON. Приложение Delphi управляет приложением C #. SOAP-часть всего этого теперь легка и «просто работает» в C # .NET, а остальная функциональность хорошо обрабатывается Delphi. Я бы порекомендовал этот маршрут кому-либо еще с похожими проблемами. Я попытался экспортировать сборку C # SOAP в виде библиотеки COM и подключиться к ней из Delphi, но она стала очень сложной, потому что спецификация SOAP в моем конкретном приложении большая и несколько сложная.

Ответы [ 4 ]

2 голосов
/ 07 июля 2010

Хорошо, это заняло некоторое время.

Согласно этой записи , существуют определенные теги, которые инструмент .NET wsdl.exe просто не распознает при импорте файла wsdl. Согласно MSDN :

attributeGroup : игнорируется. DataContractSerializer не поддерживает использование xs: group, xs: attributeGroup и xs: attribute. Эти объявления игнорируются как дочерние элементы схемы xs:, но на них нельзя ссылаться из complexType или других поддерживаемых конструкций.

Это поведение также описано (хотя и в очень трудной для понимания форме) в одном из MSDN-блогов . В моем конкретном случае конкретная часть файла wsdl, вызывающая проблему, выглядит следующим образом:

 <xs:complexType name="PhonesType">
     <xs:annotation>
         <xs:documentation xml:lang="en">Provides detailed phone information.</   xs:documentation>
     </xs:annotation>
     <xs:sequence>
         <xs:element maxOccurs="unbounded" name="Phone">
             <xs:annotation>
                 <xs:documentation xml:lang="en">Used to pass detailed phone information.</xs:documentation>
             </xs:annotation>
             <xs:complexType>
                 <xs:attributeGroup ref="TelephoneInfoGroup"/>
                 <xs:attributeGroup ref="ID_OptionalGroup">
                     <xs:annotation>
                         <xs:documentation xml:lang="en">The ID attribute in this group is a unique identifying value assigned by the creating system and may be used to reference a primary-key value within a database or in a particular implementation.</xs:documentation>
                     </xs:annotation>
                 </xs:attributeGroup>
             </xs:complexType>
         </xs:element>
     </xs:sequence>
 </xs:complexType>

Кажется, что <xs:attributeGroup ref="TelephoneInfoGroup"/> игнорируется инструментом .NET wsdl.exe, точно так же, как он игнорировался импортером Delphi wsdl. В такой ситуации, когда импорт не удается выполнить как в Delphi, так и в .NET, файл wsdl, вероятно, необходимо изменить, и это означает, что мне все-таки придется использовать мой самодельный ref-flattener python.

1 голос
/ 21 июня 2010

Я был постером первой ссылки, которую вы дали. Мне кажется, я узнал, что эта ошибка никогда не была исправлена.

Я позже опубликовал другой вопрос в сети разработчиков Embarcadero, где Ник Ходжес сказал, что

Мы концентрируемся на разработке клиента [...], если вы хотите создавать SOAP-серверы, я бы посоветовал вам также взглянуть на Delphi Prism.

Мы решили перейти на C # для разработки наших SOAP-серверов. Я решил разрешить службе общаться с базой данных, к которой затем обращается наше приложение Delphi.

Позже я столкнулся с проблемами при разработке клиента под Delphi, поэтому мы делаем это и в C #. На этот раз класс C # становится видимым и доступен из Delphi. Кажется, работает нормально.

С уважением, Миэль.

1 голос
/ 04 июня 2010

У нас была похожая проблема с Delphi 2009 и стандартным сервисом Soap (CRM). Это не было связано с attributeGroup. Мы обнаружили так много несовместимостей, что в конце концов решили использовать небольшое приложение C # в качестве прокси для реального сервиса на основе .Net.

0 голосов
/ 08 июня 2016

Импортер Delphi WSDL не может обрабатывать <xsd:attributeGroup ref="..."> элементы, но вы можете заменить их фактическими ссылочными атрибутами, с которыми импортер может иметь дело.

Ниже приведен скрипт PowerShell, который выполняет эту замену.

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

$xsdPath = "E:\scratch\InputFile.wsdl"

# Note: Must be full path.
$outPath = "E:\scratch\OutputFile.wsdl"

$xsd = [xml](gc $xsdPath)

$ns = @{xsd="http://www.w3.org/2001/XMLSchema"}

$attrGroupDefs = $xsd | 
    Select-Xml -Namespace $ns -XPath "//xsd:schema/xsd:attributeGroup" |
    select -ExpandProperty Node

$attrGroupRefs = $xsd |
    Select-Xml -Namespace $ns -XPath "//xsd:complexType/xsd:attributeGroup" |
    select -ExpandProperty Node

$attrGroupRefs | % { 
    # the thing to be replaced
    $ref = $_

    $refParent = $ref.ParentNode

    $namespace, $name = $_.ref -split ":"
    $attrs = $attrGroupDefs | ? name -eq $name | select -ExpandProperty attribute

    # remove the reference
    $refParent.RemoveChild($ref)

    # add the actual definitions
    $attrs | % {
        $newNode = $_.CloneNode($true)
        $refParent.AppendChild($newNode)
    }
}

$xsd.Save($outPath)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...