Delphi WSDL导入工具忽略了“attributeGroup”引用

sigwle7e  于 2022-12-12  发布在  其他
关注(0)|答案(4)|浏览(122)

我对Web服务完全陌生,但对 Delphi 并不陌生。
我正在用“WSDL导入器”向导将一个WSDL文件导入 Delphi 2010。WSDL文件包含一些Delphi完全忽略的“attributeGroup”标签,这可能是一个bug,尽管我还没有在质量中心找到关于这个问题的条目,只在像here和here这样的论坛中提到过。
我的问题有几个部分:
1.最佳解决方法是什么?
1.我已经编写了一个Python脚本来格式化WSDL文件,以便将所有对attributeGroup标记的引用替换为attributeGroups中定义的属性的声明;换句话说,就是扁平化引用。2输出通过“WSDL导入器”向导成功地导入到 Delphi 中,看起来是正确的,但是我还没有测试通过这个新的WSDL文件构造的消息是否能正确工作。3这个策略可能可行吗,还是我应该现在就退出,转而做其他更有效率的事情?

更新

根据我的经验和这个问题的答案,我决定使用一个C#控制台应用程序来进行 Package ,该应用程序接收JSON输入数据并输出JSON回复数据。一个 Delphi 应用程序驱动C#应用程序。整个过程中的SOAP部分现在变得毫不费力,并且在C#.NET中“正常工作”。并且 Delphi 可以很好地处理其余的功能。我会向其他有类似问题的人推荐这种方法。我确实尝试过将C# SOAP程序集导出为COM库,然后从 Delphi 连接到它,但它变得非常复杂,因为我的特定应用程序中的SOAP规范很大,而且有些复杂。

vs91vp4v

vs91vp4v1#

好吧,这个花了点时间。
根据this post,当导入wsdl文件时,.NET wsdl.exe工具无法识别某些标记。

属性组:已忽略。DataContractSerializer不支持使用xs:group、xs:attributeGroup和xs:attribute。这些声明作为xs:schema的子级被忽略,但不能从complexType或其他支持的构造中引用。

在一个MSDN blogs上也描述了这种行为(尽管是以一种非常难以理解的方式)。在我的特定示例中,导致问题的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文件可能必须被更改,这意味着我将不得不使用我自制的python ref-flattener。

mlnl4t2r

mlnl4t2r2#

我们在 Delphi 2009和标准Soap服务(CRM)中遇到了类似的问题。它与attributeGroup无关。我们发现了如此多的不兼容性,以至于我们最终决定使用一个小型C#应用程序作为真实的的基于.Net的服务的代理。

mrwjdhj3

mrwjdhj33#

我是你给予的第一个参考的海报。我想我发现这个bug从来没有被修复过。
我后来在Embarcadero开发者网络上发布了another question,Nick Hodges说:
我们专注于客户端开发[...],如果你正在寻找建立SOAP服务器,那么我建议你也给予 Delphi 棱镜看看。
我们决定改用C#来开发SOAP服务器。我决定让服务与数据库对话,然后由 Delphi 应用程序访问。
后来我在 Delphi 下开发客户端时也遇到了一些问题,所以我们也用C#来做。这次C#类是com可见的,可以从Delphi中访问。看起来工作得很好。
问候你,米尔。

ojsjcaue

ojsjcaue4#

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)

相关问题