【问题标题】:How can I set attributes for SOAP elements in Delphi?如何在 Delphi 中设置 SOAP 元素的属性?
【发布时间】:2009-05-11 17:09:15
【问题描述】:

在 SOAP 客户端请求中,标头需要此行:

<NS2:Header Name="Foo">Bar<NS2:Header>

所以我写了一个有两个字符串属性的类:

  • Content 属性 - 用于元素的值(“Bar”)
  • Name 属性 - 用于属性的值(“Foo”)

Name 属性的 AS_ATTRIBUTE 标志应该表明它是一个 XML“属性”。

   Header = class(TSoapHeader)
   private
     FContent: string;
     FName: string;
   published
     property Content: string read FContent write FContent;
     property Name: string read FName write FName stored AS_ATTRIBUTE;
   end;

并注册

   RemClassRegistry.RegisterXSClass(Header, MY_URI);
   RemClassRegistry.RegisterSerializeOptions(Header, [xoLiteralParam, 
xoSimpleTypeWrapper]);

xoLiteralTypWrapper 选项指示该类应仅在元素中“包装”值 Content 属性,而不应为其添加嵌套元素。

对于 Name := "Foo" 和 Content := "Bar",这将是 SOAP 请求中的结果 XML 代码:

<NS2:Header Name="Foo">
   <Content xsi:type="xsd:string">Bar</Content>
</NS2:Header>

属性在正确的位置,但内容值在嵌套标记中,不应该在此处。如果我从类定义中删除 Name 属性,则 Content 属性将作为元素内容看起来不错,如下所示:

<NS2:Header>Bar</NS2:Header>

这两个要求之间似乎存在冲突 - 如果我有 属性,我不会得到 xoSimpleTypeWrapper 样式。

【问题讨论】:

    标签: web-services delphi soap attributes delphi-2009


    【解决方案1】:

    我没有尝试过,所以这是一个猜测。尝试覆盖 ObjectToSOAP 和 SOAPToObject 方法。在帮助文件中它说

    重写 ObjectToSOAP 以自定义 您的应用程序转换 TSOAPHeader 其 SOAP 的后代 表示。

    同样,我还没有在编译器上尝试过,但它可能如下所示:

    function Header.ObjectToSOAP(RootNode, ParentNode: IXMLNode; 
      const ObjConverter: IObjConverter; const Name, URI: InvString; 
      ObjConvOpts: TObjectConvertOptions; out RefID: InvString): IXMLNode;  
    begin 
      ObjConvOpts := ObjConvOpts + [ocoDontSerializeProps]; 
      Result := inherited ObjectToSOAP(RootNode, ParentNode, ObjConverter, Name, URI, ObjConvOpts, RefID); 
      Result.Text := FContent; 
      Result.Attributes['Name'] := FName;
    end; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 2016-01-01
      • 2019-09-24
      • 2011-03-31
      相关资源
      最近更新 更多