Sur*_*ate 8 c# xml delphi soap web-services
我目前正在delphi 7中编写一个Web服务客户端(服务本身在c#中).一切似乎工作得很好.当我运行一个小提琴手来看看xml从我的客户端应用程序看起来如何看起来我注意到当我在c#中编写"相同"的客户端应用程序时看起来不同.下面是两个xml的
一个来自Delphi 7应用程序
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:NS2="http://tempuri.org/">
<NS1:SomeTagName xmlns:NS1="http://tempuri.org/">
<SomeID xsi:type="xsd:int">12345</SomeID>
<SomeStatus xsi:type="NS2:SomeStatusType">SOME_OK_STATUS</SomeStatus>
</NS1:SomeTagName>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)
一个来自c#app
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<SomeTagName xmlns="http://tempuri.org/">
<SomeID>12345</SomeID>
<SomeStatus>SOME_OK_STATUS</SomeStatus>
</SomeTagName>
</s:Body>
</s:Envelope>
Run Code Online (Sandbox Code Playgroud)
我不会精通xml所以我做了一些研究,到目前为止我能够说出来
但是架构怎么样 - 不确定.在Somevelo或SomeDatus标签中的数据类型中有一些额外的属性.但这来自服务wsdl(我是吗?!).
最后的问题:
至于你的第二个问题:这些 XML 文件不能被认为是相同的。原因如下:
元素SomeID和元素的命名空间SomeStatus不相同。在 Delphi XML 中,XML 中的任何位置都没有指定默认名称空间。我们只看到以下命名空间:
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"xmlns:NS2="http://tempuri.org/"xmlns:NS1="http://tempuri.org/"因此,元素SomeID和SomeStatus不在任何命名空间中,因为它们缺少命名空间前缀。
相反,来自 c# 应用程序的 XML 具有以下命名空间
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"xmlns="http://tempuri.org/"正如您所看到的,第二个xmlns属性是默认命名空间属性,因此子元素SomeID和SomeStatus位于“ http://tempuri.org/ ”命名空间中。这意味着这些元素具有不同的限定名称,因此不等效。
(如果我不得不猜测,我会认为 c# XML 是正确的,而 Delphi XML 有错误。但我无法判断,因为您引用的SOAP 标准的 XSD没有特定的Body.)
Delphi XML 具有有关SomeID和类型的附加信息SOME_OK_STATUS。这对于接收者来说可能很有用,因为SOAP 标准“不要求对这些元素进行任何特定的结构或解释,并且不提供用于指定要完成的处理的标准方法” Body。然而,如果接收者已经知道这些元素中的内容,则这些属性可能是不必要的。
这些是我看到的 XML 示例之间的主要逻辑差异。
至于最后一个问题,我们需要查看 C# 代码来明确评论为什么它生成的 XML 看起来像这样。如果XmlSerializer用于序列化,它将不会输出xsi:type非多态字段的信息,除非被迫这样做
| 归档时间: |
|
| 查看次数: |
694 次 |
| 最近记录: |