Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这两个XML是相同的吗?_C#_Xml_Web Services_Delphi_Soap - Fatal编程技术网

C# 这两个XML是相同的吗?

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

我目前正在用Delphi7编写一个web服务客户端(服务本身是用c#编写的)。一切似乎都很顺利。当我运行一个fiddler来查看客户端应用程序中的xml看起来如何时,我注意到当我用c#编写“相同”的客户端应用程序时,xml看起来是不同的。下面是两个xml

一个来自Delphi7应用程序的

<?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不是很流利,所以我做了一些研究,到目前为止我能说出来

  • UTF-8是没有编码信息的文档的默认值——这意味着这里没有区别
  • XML名称空间提供了一种避免元素名称冲突的方法——名称空间是不同的(s:和SOAP-ENV:),但有指定的名称空间,就我而言,也不应该造成差异
  • 但是模式呢?对此不确定。信封中有一些额外的属性,或者SomeID和SomeStatus标记中的数据类型。但这来自服务wsdl(我问?!)

    最后的问题:

  • 为什么用c#(vs2012)编写的应用程序没有添加所有额外的模式 将信息转换为xml。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。但是我没有办法说出来,因为您所指的没有关于
    主体的特定模式

  • Delphi XML包含关于
    SomeID
    someOK\u状态的类型的附加信息。这可能对接收者有用,因为对于
    正文
    中的元素,“不要求对这些元素进行特定的结构或解释,也不提供指定要进行的处理的标准方法”。然而,如果接收者已经知道这些元素中的预期内容,那么这些属性可能是不必要的

  • 这些是我看到的XML示例之间的主要逻辑差异

    至于最后的第一个问题,我们需要看到c#代码,以明确说明它生成的XML为何如此。如果将
    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>