Skip to main content

I want to convert xml to custom string format. If any one know please provide some inputs

Expect format:

status# statusMsg# version# key# keyType# acctID# dateStmtBegin~datePost~timePost~acctNbr~acctNbrOrig~refNbr~tranCode~amtTran~debitCredit~dateTran~transDesc~DBAName]DBACntry~stmtPrint

 

Input xml is :

 

<status>000</status>

<statusMsg>Passed</statusMsg>

<version>1.2</version>

<key>1234********4567</key>

<keyType>cardNbr</keyType>

<acctID>3052323265</acctID>

<tranDetail>

<dateStmtBegin>23-02-2017</dateStmtBegin>

<datePost>2017-12-12</datePost>

<timePost>3453456</timePost>

<acctNbr>1234********5555</acctNbr>

<acctNbrOrig>1234********5556</acctNbrOrig>

<refNbr>67899</refNbr>

<tranCode>405</tranCode>

<amtTran>708</amtTran>

<debitCredit>505</debitCredit>

<dateTran>23-07-2017</dateTran>

<transDesc>Approved</transDesc>

<merchantInfo>

<DBAName>DBA</DBAName>

<DBACntry>IND</DBACntry>

</merchantInfo>

<stmtPrint>23-07-2017</stmtPrint>

</tranDetail>

<tranDetail>

<dateStmtBegin>23-02-2017</dateStmtBegin>

<datePost>2017-02-07</datePost>

<timePost>1010</timePost>

<acctNbr>1234********5555</acctNbr>

<acctNbrOrig>1234********5556</acctNbrOrig>

<refNbr>100</refNbr>

<tranCode>405</tranCode>

<amtTran>708</amtTran>

<debitCredit>505</debitCredit>

<dateTran>23-07-2017</dateTran>

<transDesc>Approved</transDesc>

<merchantInfo>

<DBAName>DBA</DBAName>

<DBACntry>IND</DBACntry>

</merchantInfo>

<stmtPrint>23-07-2017</stmtPrint>

</tranDetail>

 

Note:1.keys should append with # .

2. subkeys append with ~

5 answers
  1. Nov 23, 2017, 9:08 PM

    @eswar49 , I'm providing a working solution but that includes a couple of assumptions on the payload and the output expected since this is supposed to work for the more generic cases.

     

    Use this DW:

     

    %dw 1.0

    %output application/json

    %var keysep = ["# ","~","]"]

    %var pairsep = "|"

    %var arraysep = "^"

    %function serializeObject(level,keypath,element)

    serializeKey(level,keypath,element) ++ pairsep ++ serializeValue(level,keypath,element)

    %function serializeKey(level,keypath,element)

    element match {

    e is :object -> e pluck serializeKey(level+1,$$,$) joinBy keysep[level],

    e is :array -> e map serializeKey(level,keypath,$) joinBy arraysep,

    e is :null -> {},

    default -> (keypath)

    }

    %function serializeValue(level,keypath,element)

    element match {

    e is :object -> e pluck serializeValue(level+1,$$,$) joinBy keysep[level],

    e is :array -> e map serializeValue(level,keypath,$) joinBy arraysep,

    e is :null -> {},

    default -> (element)

    }

    ---

    serializeObject(0,"",payload)

     

    This is a how it works:

     

    - keys and values are serialized separated as KEYS | VALUES.

    - keys (and value separators) are as seen in the output based on level of the object: "# " for first level, "~" for second level, and "]" for third level

    - elements of the collection are separated by "^"

    - The main payload is recursively traversed and serialized.

     

    Now, your XML doesn't have a root element and the `</tranDetail>` tag should be wrapped by a `</tranDetails>` since you expect a collection. The DW works assuming this is fixed. Anyway, you can test it with JSON equivalent:

     

    {

    "status": "000",

    "statusMsg": "Passed",

    "version": "1.2",

    "key": "1234********4567",

    "keyType": "cardNbr",

    "acctID": "3052323265",

    "tranDetails": [{

    "dateStmtBegin": "23-02-2017",

    "datePost": "2017-12-12",

    "timePost": "3453456",

    "acctNbr": "1234********5555",

    "acctNbrOrig": "1234********5556",

    "refNbr": "67899",

    "tranCode": "405",

    "amtTran": "708",

    "debitCredit": "505",

    "dateTran": "23-07-2017",

    "transDesc": "Approved",

    "merchantInfo": {

    "DBAName": "DBA",

    "DBACntry": "IND"

    },

    "stmtPrint": "23-07-2017"

    },

    {

    "dateStmtBegin": "23-02-2017",

    "datePost": "2017-02-07",

    "timePost": "1010",

    "acctNbr": "1234********5555",

    "acctNbrOrig": "1234********5556",

    "refNbr": "100",

    "tranCode": "405",

    "amtTran": "708",

    "debitCredit": "505",

    "dateTran": "23-07-2017",

    "transDesc": "Approved",

    "merchantInfo": {

    "DBAName": "DBA",

    "DBACntry": "IND"

    },

    "stmtPrint": "23-07-2017"

    }]

    }

     

    You should see an output like this:

     

    status# statusMsg# version# key# keyType# acctID# dateStmtBegin~datePost~timePost~acctNbr~acctNbrOrig~refNbr~tranCode~amtTran~debitCredit~dateTran~transDesc~DBAName]DBACntry~stmtPrint^dateStmtBegin~datePost~timePost~acctNbr~acctNbrOrig~refNbr~tranCode~amtTran~debitCredit~dateTran~transDesc~DBAName]DBACntry~stmtPrint|000# Passed# 1.2# 1234********4567# cardNbr# 3052323265# 23-02-2017~2017-12-12~3453456~1234********5555~1234********5556~67899~405~708~505~23-07-2017~Approved~DBA]IND~23-07-2017^23-02-2017~2017-02-07~1010~1234********5555~1234********5556~100~405~708~505~23-07-2017~Approved~DBA]IND~23-07-2017

0/9000