[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Sep 2004
    Beiträge
    129

    SQL XML_CLOB_FILE CCSID

    Hallo Forum!

    Ich habe einige XMLs in einer Tabelle gespeichert, nun möchte ich diese wieder ins IFS schreiben, was auch funktioniert, jedoch steht im Header immer
    ?xml version="1.0" encoding="IBM850"
    Da ich die Dokumente verschicken soll, hätte ich gerne UTF-8 da drinnen stehen.
    Habe versucht die XML_CLOB_FILE Variable anders zu deklarieren, aber das ändert nichts.
    In der QAQQINI steht auch *DEFAULT drinnen.

    Wie bekomme ich utf-8 ins Dokument rein??

    Danke!

    LG Peter
    [/COLOR]

    Wer andren eine Bratwurst brät, hat ein Bratwurstbratgerät!

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    SQL ändert nichts am Inhalt eines XML-Dokuments, da dies reine Textinformation ist.
    Hier hilft nur, den Inhalt der XML erst mal in eine UCS2-Variable ins Programm einzulesen (CLOB), den gewünschten Text ändern und anschließend die Datei per CLOB_FILE-Variable dann zu schreiben.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Sep 2004
    Beiträge
    129
    Nicht am Inhalt, aber am Header. Im Typ XML in der Datenbank ist keine Headerinformation drinnen und wird beim Schreiben in eine Filevariable eingefügt. Ich lese das XML mit GET_XML_FILE() ein, der Header im IFS ist xml version="1.0" encoding="UTF-8", wenn ich es dann wieder rausschreibe, steht IBM850 anstelle von UTF-8 drinnen.
    Wer andren eine Bratwurst brät, hat ein Bratwurstbratgerät!

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Wenn der Datentyp der Spalte in der Tabelle XML ist, und bei der Spalten-Definition keine CCSID angegeben wurde, wird die CCSID aus der QAQQINI verwendet, d.h. die Daten sind per Default UTF-8.

    Wenn Du mit embedded SQL und XML_CLOB_FILE das Dokument ins IFS schreibst erfolgt die Ausgabe als UTF-8 Daten.

    Sofern Deine XML-Daten alphanumerisch (EBCDIC) oder auch Double Byte z.B. UCS2 sind, kannst Du das XML-Dokument, mit XMLPARSE und XMLSERIALIZE in ein UTF-8 Daten konvertieren.
    XMLPARSE prüft ob es sich um gültige XML-Daten handelt und konvertiert diese in ein internes Format.
    XMLSERIALIZE konvertiert aus dem internen Format in einen alphanumerischen String.

    Beispiel:

    Code:
    Values(XMLSerialize(
               XMLParse(Document 'ABCDEDer Bär frißt öfter grüne Äpfel') 
                        as VarChar(1024) ccsid 1208 including XMLDeclaration));
    Including XMLDeclaration bewirkt an dieser Stelle nur, dass noch eine XML-Deklaration hinzugefügt wird. Wird es nicht angegeben, wird keine Deklaration hinzugefügt.

    UCS2 ist übrigens ein Double Byte Character Set und verlangt folglich einen DBCLOB (Double Byte Large Object)!

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Gute Erklärung, geht am Problem aber vorbei.
    In der XML steht eine Encoding-Anweisung, z.B.:

    ?xml version="1.0" encoding="ISO-8859-1" ?

    Bei der Ausgabe der XML-Datei ins IFS mit UTF8 soll genau diese Anweisung nun angepasst werden:

    ?xml version="1.0" encoding="UTF-8" ?

    Und genau dies passiert eben nicht, da SQL ja den textlichen Inhalt nicht verfälschen darf.
    Wenn also eine Codewandlung durchgeführt wird, so ist die Process-Anweisung eben manuell (also per Code) selber durchzuführen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Sep 2004
    Beiträge
    129
    Also wenn ich das Dokument mit xmlserialize und xmlparse in ein XML_CLOB_FILE zu schreiben versuche, sagt der Compiler, dass die Variable nicht kompatibel ist.
    Mach ich
    Code:
     select xmlserialize(xmlparse(Document xml_document ....
    Kommt Argument 1 der Funktion xmlparse ungültig.
    Wenn ich
    Code:
     select xmlserialize(xmlparse(Document xmlserialize(xml_document as varchar(1024) ccsid 1208) from file
    mache, dann steht wieder IBM850 im File.

    Das original XML hat im Header UTF-8 stehen.

    Ich möchte eigentlich nur das original XML wieder zurück.
    Wer andren eine Bratwurst brät, hat ein Bratwurstbratgerät!

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    "Ich möchte eigentlich nur das original XML wieder zurück."
    Warum speicherst du dieses nicht einfach separat in einem BLOB?
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  8. #8
    Registriert seit
    Sep 2004
    Beiträge
    129
    Ok, ich hatte da beim Testen einen Fehler.
    Es ist genauso wie Birgitta geschrieben hat und funktioniert jetzt.

    Verzeihung...

    Danke!
    Wer andren eine Bratwurst brät, hat ein Bratwurstbratgerät!

Similar Threads

  1. CCSID
    By svit in forum NEWSboard Programmierung
    Antworten: 9
    Letzter Beitrag: 02-03-17, 08:04
  2. CCSID für XML mit UTF-8
    By Joe in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 20-09-16, 15:05
  3. PC, CCSID und IFS
    By ILEMax in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 10-12-14, 14:24
  4. CCSID zu x ten mal
    By Robi in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 15-08-14, 16:22
  5. CHG CCSID ?
    By Liebhoff in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 04-09-02, 09:27

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •