So dekodieren Sie das XML Blob-Feld in D7

8

Ich habe ein Problem beim Dekodieren von XML-Daten, die von einer Instanz von MS SQL Server 2014 an eine in D7 geschriebene Anwendung zurückgegeben wurden. (die Version von Indy ist die, die damit geliefert wurde, 9.00.10) .

Update Als ich dieses q ursprünglich geschrieben habe, hatte ich den Eindruck, dass der Inhalt des Blob-Felds Base64-dekodiert sein muss, aber es scheint, dass das falsch war. Nach Remy Lebeaus Vorschlag enthält der Blob-Stream erkennbaren Text in den Feldnamen und Feldwerten vor der Decodierung, aber nicht danach.

Im folgenden Code ist das SQL in der AdoQuery einfach

  

Wählen Sie * aus Autoren, wo au_lname = 'Weiß' für XML Auto

Die Authors-Tabelle ist diejenige in der Demo-Datenbank 'pubs'. Ich habe die "Where" -Klausel hinzugefügt, um die Größe der Ergebnismenge einzuschränken, sodass ich einen Hex-Dump des zurückgegebenen Blobs anzeigen kann.

Laut Sql Server OLH ist der Standardtyp der zurückgegebenen Daten, wenn 'Für XML Auto' angegeben ist, 'binary base64-codiertes Format'. Der Datentyp des einzelnen Feldes der AdoQuery ist ftBlob, wenn ich die IDE dieses Feld anlegen lasse.

Das Ausführen des folgenden Codes erzeugt eine Ausnahme "Ungleiche Größe in DecodeToStream". Beim Aufruf von IdDecoderMIME.DecodeToString(S) ist die Länge der Zeichenfolge S 3514, und 3514 mod 4 ist 2, nicht 0, wie es anscheinend sein sollte, daher die Ausnahme. Ich habe bestätigt, dass die Anzahl der Bytes im Wert des Feldes 3514 ist, also gibt es keinen Unterschied zwischen der Größe der Variante und der Länge der Zeichenfolge, d. H. Nichts ist dazwischen gewandert.

%Vor%

Ich benutze diesen Code:

%Vor%

Ein Hex-Dump der Blob.Txt-Datei sieht so aus

%Vor%

Wie Sie sehen können, ist einiges davon lesbar (Feldnamen und Inhalt), einige davon nicht. Kennt jemand dieses Format und weiß, wie es in den Klartext aufgeräumt wird, den ich von der Ausführung derselben Abfrage in SS Management Studio erhalte, d. H. Wie kann ich das XML erfolgreich aus der Ergebnismenge extrahieren?

Übrigens bekomme ich das gleiche Ergebnis (einschließlich des Inhalts der Blob.Txt-Datei), indem ich sowohl den Provider MS OLE DB Provider für SQL Server als auch den Provider Sql Server Native Client 11 verwende und Delphi Seattle anstelle von D7 verwende / p>

Da der Code auf eine externe Datenbank zugreift, ist dieser Code der nächste, den ich einem MCVE am nächsten bringen kann.

Update # 2 Das Dekodierungsproblem verschwindet, wenn ich die Sql-Abfrage in

ändere %Vor%

gibt das Ergebnis (in SS ) von

an %Vor%

aber ich bin immer noch interessiert zu wissen, wie man das ohne Convert () zum Laufen bringt. Ich habe festgestellt, dass, wenn ich die Where-Klausel aus der Sql entferne, nicht wohlgeformtes XML zurückgegeben wird - es enthält eine Reihe von Knoten, einen pro Datenzeile, aber keinen umschließenden Wurzelknoten.

Außerdem merke ich, dass ich dieses Problem vermeiden kann, indem ich "Für XML Auto" nicht verwende, ich bin nur daran interessiert, wie es richtig gemacht wird. Außerdem brauche ich keine Hilfe beim Parsen der XML, nachdem ich sie extrahiert habe.

    
MartynA 05.12.2016, 21:32
quelle

2 Antworten

4

Fügen Sie die TYPE-Direktive hinzu, um anzugeben, dass XML zurückgegeben werden soll.

%Vor%     
Mikael Eriksson 06.12.2016, 13:05
quelle
2

Sie können das binäre Blob nicht einfach in XML dekodieren.

Sie können TADOCommand verwenden und den Ausgabestream auf ein XML-Dokumentobjekt richten, z. B .:

%Vor%

Dies ergibt ein wohlgeformtes XML mit dem umgebenden Wurzelknoten RootNode .

    
kobik 06.12.2016 13:58
quelle

Tags und Links