2014-12-29 5 views
8

В настоящее время я пишу клиент веб-сервиса в delphi 7 (сама служба находится в C#). все, кажется, работает отлично. когда я запускаю скрипач, чтобы посмотреть, как выглядит xml из моего клиентского приложения, я заметил, что выглядит иначе, когда я пишу «то же» клиентское приложение в C#. Ниже приведены два xml`sЭти два 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> 

один, который идет от C# приложение

<?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> 

я не владеет XML, так что я сделал некоторые исследования и к этому моменту я могу сказать, что

  1. UTF-8 по умолчанию для документов без кодирования информации - ref. here - t hat означает, что здесь нет разницы
  2. Пространства имен XML предоставляют способ избежать конфликтов имен элементов - ref. here - пространства имен разные (s: и SOAP-ENV :), но они указаны, и, насколько мне известно, не должно меняться либо

но как насчет схемы - не уверен в этом. В Envelope или datatypes есть некоторые дополнительные атрибуты в тегах SomeID и SomeStatus. Но это произошло из службы wsdl (я не хочу ?!).

Заключительные вопросы:

  1. Почему приложение написано в C# (vs2012) не добавлять все дополнительные схемы информацию XML-. Действительно ли это имеет значение, если у них есть xml или нет?
  2. может ли кто-нибудь сказать, могут ли они считаться одинаковыми?

ответ

1

Что касается Вашего второго финального вопроса: эти XML-файлы нельзя считать одинаковыми. Вот почему:

  1. Пространства имен для элементов SomeID и SomeStatus не то же самое. В XML-формате Delphi значение default namespace никогда не указывается нигде в 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 не находятся в каком-либо пространстве имен, так как им не хватает префикса пространства имен.

    С другой стороны, XML с C# приложение имеет следующие пространства имен

    • xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
    • xmlns="http://tempuri.org/"

    Как вы можете видеть, второй xmlns атрибут является атрибутом пространства имен по умолчанию, так что дочерние элементы SomeID и SomeStatus находятся в пространстве имен «http://tempuri.org/». Это означает, что эти элементы имеют разные qualified names и, таким образом, не эквивалентны.

    (Если бы я должен был догадаться, я считаю, что C# XML является правильным и XML Delphi есть ошибка. Но у меня нет никакого способа, чтобы сказать, так как XSD for the SOAP standard, к которому вы обращаетесь не имеет конкретной схемы для Body.)

  2. В Delphi XML есть дополнительная информация о типах SomeID и SOME_OK_STATUS. Это может быть полезно для приемников, поскольку SOAP standard «не предусматривает никакой конкретной структуры или интерпретации этих элементов и не предоставляет стандартных средств для указания обработки, которая должна быть выполнена» для элементов внутри Body. Однако, если получатель уже знает, чего ожидать в этих элементах, эти атрибуты могут оказаться ненужными.

Это основные логические различия между образцами XML, которые я вижу.

Что касается первого заключительного вопроса, нам нужно будет увидеть код C#, чтобы окончательно прокомментировать, почему создаваемый XML выглядит так. Если для сериализации использовалось XmlSerializer, оно не выводит xsi:type информацию для неполиморфных полей, если forced to do so

0

1 - как указано, UTF-8 по умолчанию так может быть опущен

2 - s и SOAP-ENV относятся к объектам того же типа, как указано отсылая к тому же пространству имен - http://schemas.xmlsoap.org/soap/envelope/. вы можете перейти по ссылке, чтобы увидеть схему объекта. Это говорит о том, что оба s и SOAP-ENV являются объектами типа Envelope, как описано в схеме

3 - определение типа объекта из SomeTagName не является обязательным, поскольку это не refered в другом месте, как это происходит с Envelope объекта, refered в объявлении Body, которое потребовало определения (по заданному чтению дайте ему имя, так как оно действительно определено пространством имен). Таким образом, NS1 объявляется одним, а не другим именем. В этом случае требуется только пространство имен, и оба имеют его.

4 - другое отличие, которое я вижу, заключается в том, что версия Delphi устанавливает пространство имен не сложных типов (например, xsd:int). это снова необязательно, поскольку это задано в схеме, которая должна регулировать это. Если схема ссылается на один тип и запрос/ответ другой, то у нас есть проблема.

Единственное, что действительно делает эти две отличается тем, что полезная нагрузка на версии Дельфи будет намного больше на больших запросов/ответов которым может быть consern с мобильными устройствами

Смежные вопросы