[Gelöst] Problem mit SOAP-Webservice und Umlauten

7. März 2019 10:07

Ich habe einen SOAP-Webservice in NAV 2016 erstellt, mit dem eine Methode aufgerufen werden kann, der einen Parameter als BigText-Variable enthält. Über diesen Parameter kann eine XML-Struktur übergeben werden. Das Problem tritt auf, wenn ein XML-Element als Wert einen String mit Umlauten enthält, wie folgendes Beispiel zeigt:

Variablen:
Code:
TempBlob      Record          TempBlob (Tabelle zur temporären Nutzung mit Primary Key und einem Blob-Feld)
writeStream   OutStream
readStream    InStream
XMLDOM        DotNet          System.Xml.XmlDocument...


C/AL-Code der Funktion "ImportXML (XMLFile : BigText) : Text[250]" (ist in einer Codeunit enthalten und wird per Webservice aufgerufen):
Code:
IF ISNULL(XMLDOM) THEN
  XMLDOM := XMLDOM.XmlDocument();
TempBlob.Blob.CREATEOUTSTREAM(writeStream);
XMLFile.WRITE(writeStream);
TempBlob.INSERT;
TempBlob.CALCFIELDS(TempBlob.Blob);
TempBlob.Blob.CREATEINSTREAM(readStream);
XMLDOM.Load(readStream);


Die XML-Struktur, die per Parameter "XMLFile" in obiger Funktion übergeben wird, sieht (gekürzt) so aus:
Code:
<Bestellung>
  <Kreditor>12345</Kreditor>
  <Nr.>789</Nr.>
  <Name>Müller</Name>
</Bestellung>


Wenn ich jetzt die XML-Struktur in einen SOAP-Envelope einbette und per SoapUI an den NAV-Webservice sende, erhalte ich als Response folgende Fehlermeldung:
Fehler bei einem Aufruf von System.Xml.XmlDocument.Load mit folgender Meldung: Ungültiges Zeichen in der angegebenen Codierung. Zeile 4, Position 10.



Wenn ich der XML-Struktur folgende Zeile mit einer Zeichenkodierung voranstelle, erhalte ich die Fehlermeldung nicht:
<?xml version="1.0" encoding="ISO-8859-1"?>


Das Problem ist, dass ich nicht bestimmen kann, dass die Zeile in der XML-Struktur enthalten ist, da sie von "dritter Seite" geliefert wird und sie standardmäßig nicht enthalten ist.


Meine Frage ist nun, wie ich das Problem in Navision abfangen kann. Kann ich eventuell herausfinden, welche Zeichenkodierung Navision verwendet, damit ich die oben dargestellt Zeile mit der entsprechenden Zeichenkodierung selbst einfügen kann? Ich bin über jeden Hinweis dankbar.
Zuletzt geändert von niehaves am 8. März 2019 17:23, insgesamt 1-mal geändert.

Re: Problem mit SOAP-Webservice und Umlauten

8. März 2019 12:58

Drei Ansätze bzw. Tipps dazu:
  • Du solltest dem Drittanbieter dein Problem schildern und ihn a) nach dem Encoding fragen und b) inwiefern er das Encoding im XML voranstellen kann (so wie es im Übrigen auch Standard sein sollte).
  • Beim Stream Create gibt es einen weiteren optionalen Parameter, mit dem man das Encoding bestimmen kann.
  • Neben Load gibt es auch LoadXML.

Re: Problem mit SOAP-Webservice und Umlauten

8. März 2019 17:21

Danke für die Hinweise. Ich setze jetzt, nach Absprache mit dem Drittanbieter, das Encoding voraus und verwende dazu den optionalen Parameter im "CreateOutstream"-Befehl wie folgt:
Code:
TempBlob.Blob.CREATEOUTSTREAM(writeStream,TEXTENCODING::UTF8);

Re: [Gelöst] Problem mit SOAP-Webservice und Umlauten

9. März 2019 11:54

Dann sollte die erste Zeile in der XML beim Encoding aber auch dahingehend angepasst werden, denn ISO 8859-1 und UTF-8 sind verschiedene Kodierungen. Das fällt nicht unbedingt sofort auf, bei Sonderzeichen aber schon weil die ISO-Codepage hier den dortigen beschränkten Zeichenvorrat mit einem Byte abbildet, UTF-8 hier den gesamten Unicodezeichenvorrat mit mindestens 2 Bytes anbietet (und max. 4 Bytes bei exotischen Zeichen).