Bu Groovy script, responseBodyTextFromTargetAPI değişkeninden gelen XML veriyi ayrıştırır, hiyerarşik yapısını koruyarak JSON formatına dönüştürür ve Unicode kaçış dizilerini (\uXXXX formatındaki Türkçe karakterler dahil) okunabilir gerçek karakterlere çevirerek responseBodyTextToClient değişkenine atar.
import groovy.json.JsonOutput
import groovy.xml.XmlSlurper
// "<?...?>" satırlarını temizleme
def cleanedXml = responseBodyTextFromTargetAPI.readLines()
.findAll { !it.trim().startsWith("<?") }
.join("\n")
.trim()
// Sadeleştirilmiş XML to Map dönüşüm fonksiyonu
def convertToMap(node) {
def map = [:]
// Attribute'ları ekle (@ işareti ile başlayarak)
node.attributes().each { key, value ->
map["@${key}"] = value.toString()
}
// Alt elementleri kontrol et
def hasElements = false
node.children().each { child ->
if (child.name()) {
hasElements = true
def childName = child.name()
// Çocuk elemanların alt elementleri var mı?
def childText = child.text().trim()
def childHasElements = false
child.children().each { grandchild ->
if (grandchild.name()) {
childHasElements = true
}
}
// Alt element yoksa direkt değeri kullan, varsa recursive devam et
def childValue
if (!childHasElements) {
// Alt element yoksa, metin içeriği boş olsa bile boş string döndür
childValue = childText.isEmpty() ? "" : childText
} else {
// Alt element varsa, recursive map oluştur
childValue = convertToMap(child)
// Eğer bu child tamamen boş ise (hiç değer içermiyorsa) boş string döndür
if (childValue.isEmpty()) {
childValue = ""
}
}
// Aynı isimde birden fazla eleman varsa liste olarak birleştir
if (map.containsKey(childName)) {
if (!(map[childName] instanceof List)) {
map[childName] = [map[childName]]
}
map[childName] << childValue
} else {
map[childName] = childValue
}
}
}
return map
}
try {
// XML parse
def xml = new XmlSlurper().parseText(cleanedXml)
def resultMap = [(xml.name()): convertToMap(xml)]
// JSON çıktısı - Unicode kaçış dizilerini okunabilir karakterlere dönüştür
def jsonOutput = new JsonOutput()
def jsonString = jsonOutput.toJson(resultMap)
// Pretty print yap
def prettyJson = jsonOutput.prettyPrint(jsonString)
// Türkçe karakterleri düzelt
def normalizedJson = prettyJson.replaceAll('\\\\u([0-9A-Fa-f]{4})', { fullMatch, hexValue ->
try {
return new String(Character.toChars(Integer.parseInt(hexValue, 16)))
} catch (Exception e) {
return fullMatch // Dönüştürülemezse orijinal değeri koru
}
})
responseBodyTextToClient = normalizedJson
} catch (Exception e) {
responseBodyTextToClient = JsonOutput.prettyPrint(JsonOutput.toJson([
error: "XML ayrıştırma hatası: ${e.message}"
]))
}
Örnek
XML olarak gelen Response
<?xml version="1.0" encoding="UTF-8"?>
<Tarih_Date Tarih="02.05.2025" Date="05/02/2025" Bulten_No="test">
<Currency CrossOrder="0" Kod="1" CurrencyCode="2">
<Unit> 1 </Unit>
<Isim> 2 </Isim>
<CurrencyName> 3 </CurrencyName>
</Currency>
</Tarih_Date>
Dönüştürülmüş JSON Response
{
"Tarih_Date": {
"@Tarih": "02.05.2025",
"@Date": "05/02/2025",
"@Bulten_No": "test",
"Currency": [
{
"@CurrencyCode": "2",
"@Kod": "1",
"@CrossOrder": "0",
"Unit": "1",
"Isim": "2",
"CurrencyName": "3",
}
]
}
}
Açıklama
Bu script şu işlemleri gerçekleştirir:
- XML Temizleme: XML’deki
<?...?> satırları temizlenir
- XML Parse: XML verisi parse edilir
- JSON Dönüşümü: XML yapısı JSON formatına dönüştürülür
- Unicode Normalleştirme: Unicode kaçış dizileri (\uXXXX formatındaki Türkçe karakterler dahil) okunabilir karakterlere çevrilir
- Hata Yönetimi: Hata durumunda hata mesajı JSON formatında döner
Bu script, response hattında (Response Policy) çalıştırılmalıdır çünkü responseBodyTextFromTargetAPI ve responseBodyTextToClient değişkenlerini kullanmaktadır.