sind diese beiden XMLs gleich?

8

Ich schreibe gerade einen Web-Service-Client in Delphi 7 (Dienst selbst ist in c #). Alles scheint gut zu funktionieren. Wenn ich einen Fiddler betreibe, um zu sehen, wie das XML aus meiner Client-App aussieht, merkte ich, dass es anders aussieht, wenn ich die "gleiche" Client-App in c # schreibe. Unten sind zwei xmls

eine, die von einer Delphi 7 App geht

%Vor%

eine, die von c # app

geht %Vor%

ich bin nicht fließend in xml, also habe ich etwas recherchiert und zu diesem Moment kann ich das sagen

  1. UTF-8 ist die Standardeinstellung für Dokumente ohne Kodierungsinformationen - ref. hier - das bedeutet keinen Unterschied hier
  2. XML-Namespaces bieten eine Methode zur Vermeidung von Namenskonflikten - ref. hier - Namespaces sind verschieden (s: und SOAP-ENV :) aber es gibt bestimmte, und soweit es mich betrifft, sollte auch nicht der Unterschied gemacht werden

aber was ist mit dem Schema - nicht sicher darüber. Es gibt einige zusätzliche Attribute in den Envelope- oder Datentypen in SomeID- und SomeStatus-Tags. Aber das kam vom Dienst wsdl (ich quess ?!).

Letzte Fragen:

  1. Warum die in c # (vs2012) geschriebene App nicht das gesamte zusätzliche Schema hinzufügt Informationen zum XML. Ist es wirklich wichtig, ob das XML sie hat oder? nicht?
  2. kann jemand sagen, ob diese als gleich betrachtet werden können?
Surrogate 29.12.2014, 12:07
quelle

2 Antworten

1

Was Ihre zweite letzte Frage betrifft: Diese XML-Dateien können nicht als gleich angesehen werden. Hier ist warum:

  1. Die Namespaces für die Elemente SomeID und SomeStatus sind nicht identisch. In der Delphi-XML wird im XML-Code niemals ein Standardnamespace angegeben. Wir sehen nur die folgenden Namespaces:

    • 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/"

    Somit befinden sich die Elemente SomeID und SomeStatus in keinem Namespace, da ihnen ein Namespacepräfix fehlt.

    Umgekehrt hat der XML-Code aus der c # -App die folgenden Namespaces

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

    Wie Sie sehen, ist das zweite xmlns -Attribut ein Standard-Namespace-Attribut, also befinden sich die untergeordneten Elemente SomeID und SomeStatus im " Ссылка "Namensraum. Dies bedeutet, dass diese Elemente unterschiedliche qualifizierte Namen haben und somit nicht gleichwertig sind.

    (Wenn ich raten müsste, würde ich annehmen, dass das c # XML korrekt ist und das Delphi XML einen Fehler hat. Aber ich kann es nicht sagen seit dem XSD für den SOAP-Standard , auf den Sie verweisen, hat kein bestimmtes Schema für Body .

  2. Das XML von Delphi enthält zusätzliche Informationen zum Typ von SomeID und SOME_OK_STATUS . Dies kann für Empfänger nützlich sein, da der SOAP-Standard "keine bestimmte Struktur oder Interpretation dieser Elemente vorschreibt, und bietet kein Standard-Mittel zum Festlegen der durchzuführenden Verarbeitung "für Elemente in Body . Wenn der Empfänger jedoch bereits weiß, was in diesen Elementen zu erwarten ist, können diese Attribute unnötig sein.

Dies sind die wichtigsten logischen Unterschiede zwischen den XML-Beispielen, die ich sehe.

Was die erste letzte Frage betrifft, müssten wir den c # -Code sehen, um definitiv zu erklären, warum das XML, das er erzeugt, so aussieht. Wenn XmlSerializer für die Serialisierung verwendet wurde, wird xsi:type für nicht polymorphe Felder nicht ausgegeben, es sei denn dazu gezwungen

    
dbc 29.12.2014, 23:01
quelle
0

1 - Wie Sie angegeben haben, ist UTF-8 Standard und kann daher weggelassen werden

2 - s und SOAP-ENV beziehen sich auf die Objekte desselben Typs, die durch Bezugnahme auf denselben Namespace angegeben wurden - Ссылка . Sie können dem Link folgen, um das Schema des Objekts zu sehen. Dies bedeutet, dass sowohl s als auch SOAP-ENV Objekte vom Typ Envelope sind, wie im Schema

beschrieben

3 - das Definieren des Objekttyps von SomeTagName ist optional, da es anderswo nicht referenziert wird, wie es bei dem Objekt Envelope der Fall ist, auf das in der Deklaration von Body verwiesen wird definiertes Lesen geben Sie ihm einen Namen, da es wirklich durch den Namensraum definiert ist). So wird NS1 in einem, aber nicht in dem anderen mit einem beliebigen Namen deklariert. Nur der Namespace ist in diesem Fall erforderlich und beide haben es.

4 - Der andere Unterschied, den ich sehe, ist, dass die Delphi-Version den Namespace von nicht komplexen Typen (wie xsd:int ) festlegt. Dies ist wiederum optional, da dies im Schema festgelegt ist, das sollte dies regeln. Wenn das Schema auf einen Typ und die Anfrage / Antwort auf einen anderen verweist, haben wir ein Problem.

Das Einzige, was diese beiden Unterschiede macht, ist, dass die Payload auf der Delphi-Version bei großen Anfragen / Antworten, die mit mobilen Geräten in Frage kommen, viel größer ist

    
537mfb 29.12.2014 20:29
quelle

Tags und Links