C# 这两个XML是相同的吗?
我目前正在用Delphi7编写一个web服务客户端(服务本身是用c#编写的)。一切似乎都很顺利。当我运行一个fiddler来查看客户端应用程序中的xml看起来如何时,我注意到当我用c#编写“相同”的客户端应用程序时,xml看起来是不同的。下面是两个xml 一个来自Delphi7应用程序的C# 这两个XML是相同的吗?,c#,xml,web-services,delphi,soap,C#,Xml,Web Services,Delphi,Soap,我目前正在用Delphi7编写一个web服务客户端(服务本身是用c#编写的)。一切似乎都很顺利。当我运行一个fiddler来查看客户端应用程序中的xml看起来如何时,我注意到当我用c#编写“相同”的客户端应用程序时,xml看起来是不同的。下面是两个xml 一个来自Delphi7应用程序的 <?xml version="1.0"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelop
<?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>
12345
一些“OK”状态
一个来自c#app的
12345
一些“OK”状态
我对xml不是很流利,所以我做了一些研究,到目前为止我能说出来
1-如您所述,
UTF-8
是默认值,因此可以省略
2-s
和SOAP-ENV
引用相同名称空间指定的相同类型的对象。您可以按照链接查看对象的模式。这就是说s
和SOAP-ENV
都是Envelope
类型的对象,如模式中所述
3-定义SomeTagName
的对象类型是可选的,因为它不会在其他地方引用,就像在Body
声明中引用的Envelope
对象一样,它要求定义它(通过定义读取给它一个名称,因为它实际上是由命名空间定义的)。因此,NS1
在其中一个中声明,但在另一个中不以任何名称声明。在这种情况下,只需要名称空间,并且两者都有名称空间
4-我看到的另一个区别是Delphi版本设置了非复杂类型的名称空间(如xsd:int
)。这同样是可选的,因为在模式中设置了它,它应该控制这个,如果模式引用一种类型,而请求/响应引用另一种类型,那么我们就有问题了
唯一让这两个不同的是,delphi版本上的负载在大请求/响应上会大得多,这可能与移动设备有关。至于最后一个问题:这些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
位于“”名称空间中。这意味着这些元素具有不同的属性,因此不是等价的
(如果我不得不猜测的话,我会认为c#XML是正确的,Delphi XML有一个bug。但是我没有办法说出来,因为您所指的没有关于主体的特定模式
)SomeID
和someOK\u状态的类型的附加信息。这可能对接收者有用,因为对于正文
中的元素,“不要求对这些元素进行特定的结构或解释,也不提供指定要进行的处理的标准方法”。然而,如果接收者已经知道这些元素中的预期内容,那么这些属性可能是不必要的
XmlSerializer
用于序列化,则它不会输出非多态字段的xsi:type
信息,除非
<?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>