Neden XML her yerde karşımıza çıkıyor?

TROIA Web Service'in callService() metodu parametreleri XML formatında alır ve XML döner (bkz. CANIAS Web Service yazım). Bu yüzden TROIA'nın XML'i işleme fonksiyonları hem web servis geliştirirken hem de üçüncü parti sistemlerle entegre olurken sürekli devrede.

Basit belgeler için otomatik ayrıştırıcı

Yapısı düz (iç içe ilişki içermeyen) bir XML belgesini doğrudan bir TABLE'a çevirmek için PARSEXML TEXT ... INTO yeterlidir — ayrı bir eşleme (map) tanımlamaya gerek yoktur:

LOCAL:
    TABLE MUSTERILER,
    STRING XMLMETIN;

XMLMETIN = '<MusteriListesi><Musteri><Ad>ABC Ltd</Ad></Musteri></MusteriListesi>';

PARSEXML TEXT XMLMETIN INTO MUSTERILER;

Karmaşık belgeler için XML MAP

Elementler arası ilişki (üst-alt tablo) içeren belgelerde CREATEXMLMAP ile bir eşleme tanımlanır — hangi element hangi tabloya, hangi öznitelik (attribute) hangi sütuna karşılık geliyor:

CREATEXMLMAP SIPARISMAP;

MAP ELEMENT Siparis AS XMLROOTTABLE Siparis IN SIPARISMAP;
MAP ATTRIBUTE No OF Siparis AS XMLCOLUMN SiparisNo IN SIPARISMAP;

MAP ELEMENT Kalem AS XMLTABLE Kalem IN SIPARISMAP;
MAP CHILD Miktar OF Kalem AS XMLCOLUMN Miktar IN SIPARISMAP;
MAP RELATION Kalem TO Siparis LINK SiparisNo WITH SiparisNo GENERATE YES IN SIPARISMAP;

PARSEXML '.\gelen.xml' USING SIPARISMAP;
CONVERTXMLTABLE Kalem INTO TABLE KALEMLER FROM SIPARISMAP;

Bu yaklaşım daha uzun ama üst-alt ilişkileri (bir siparişin birden çok kalemi gibi) doğru şekilde ayrı tablolara böler.

JSON: XML'e köprü üzerinden

TROIA'da doğrudan bir JSON ayrıştırıcısı yoktur; CONVERTXMLJSON() fonksiyonu XML ile JSON arasında iki yönlü dönüşüm yapar. Yani bir JSON API'den veri alıyorsanız, önce JSON'ı XML'e çevirip sonra yukarıdaki yöntemlerle işlersiniz:

LOCAL:
    STRING XMLHALI;

XMLHALI = CONVERTXMLJSON(JSONMETIN, 'XML', 'NOTYPEHINT');

Sonuç

Basit, ilişkisiz belgeler için PARSEXML TEXT ... INTO çoğu zaman yeterli; ilişkili (üst-alt) veri geldiğinde CREATEXMLMAP ile açık bir eşleme tanımlamak, sonradan hata ayıklamayı çok kolaylaştırıyor.