import [Link].
*;
public class MTParserString {
public static String convertToXml(String inputText) {
StringBuilder xml = new StringBuilder();
[Link]("<Document
xmlns=\"urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08\">\n");
[Link](" <FIToFICstmrCdtTrf>\n");
// Process <GrpHdr>
Matcher grpHdrMatcher = [Link]("<GrpHdr>(.*?)</GrpHdr>",
[Link]).matcher(inputText);
if ([Link]()) {
String grpHdrBlock = [Link](1);
[Link](" <GrpHdr>\n");
convertKeyValueBlock(grpHdrBlock, xml, 6);
[Link](" </GrpHdr>\n");
}
// Process <CdtTrfTxInf>
Matcher txInfMatcher = [Link]("<CdtTrfTxInf>(.*?)</CdtTrfTxInf>",
[Link]).matcher(inputText);
if ([Link]()) {
String txBlock = [Link](1);
[Link](" <CdtTrfTxInf>\n");
String[] lines = [Link]("\\n");
for (String line : lines) {
line = [Link]();
if ([Link]("<") && [Link](">")) {
[Link](" ").append(line).append("\n");
} else if ([Link]("=")) {
String[] parts = [Link]("=", 2);
if ([Link] == 2) {
String key = parts[0].trim().replaceAll("\\s+", "").replace("\"", "");
String value = parts[1].trim().replace("\"", "");
if ([Link]("Ccy")) {
String[] kv = [Link]("Ccy");
if ([Link] == 2) {
[Link](" <").append(kv[0].trim())
.append(" Ccy=\"").append(kv[1].trim()).append("\">")
.append(value).append("</").append(kv[0].trim()).append(">\
n");
} else {
// fallback if Ccy format is weird
[Link](" <").append(key).append(">")
.append(value).append("</").append(key).append(">\n");
}
} else {
[Link](" <").append(key).append(">")
.append(value).append("</").append(key).append(">\n");
}
}
} else if (![Link]()) {
// optional: if line is not empty and not handled, output as comment or
skip
[Link](" <!-- Unrecognized line: ").append(line).append(" -->\n");
}
}
[Link](" </CdtTrfTxInf>\n");
}
[Link](" </FIToFICstmrCdtTrf>\n");
[Link]("</Document>\n");
return [Link]();
}
private static void convertKeyValueBlock(String block, StringBuilder xml, int
indent) {
String[] lines = [Link]("\\n");
String pad = " ".repeat(indent);
for (String line : lines) {
line = [Link]();
if ([Link]("=")) {
String[] parts = [Link]("=", 2);
String key = parts[0].trim().replaceAll("\\s+", "");
String value = parts[1].trim();
[Link](pad).append("<").append(key).append(">")
.append(value).append("</").append(key).append(">\n");
}
}
}
// Example usage
public static void main(String[] args) {
String inputText = """
<FIToFICstmrCdtTrf>
<GrpHdr>
MsgId = PACS8BIZMSGIDR01
CreDtTm = 9999-12-31T00:00:00+00:00
NbOfTxs = 1
SttlmMtd = INDA
</GrpHdr>
<CdtTrfTxInf>
<PmtId>
InstrId = PACS8BIZMSGIDR01
EndToEndId = PACS008ENDTOENDID-111
UETR = f1636d6e-1ed0-4b56-a7be-5706eb62ba9f
</PmtId>
IntrBkSttlmAmt Ccy="SGD" = 500000
IntrBkSttlmDt = 2020-08-05
ChrgBr = DEBT
<InstgAgt>
<FinInstnId>
BICFI = WPACAU2SXXX
BICFI = DBSSSGSGXXX
</FinInstnId>
</InstgAgt>
<Dbtr>
Nm = AUSTRALIAN SUBMARINE
<PstlAdr>
AdrLine = 2/275 KENT ST
AdrLine = 3/AU/SYDNEY
</PstlAdr>
</Dbtr>
<DbtrAcct>
<Id>
<Othr>
Id = ABC123
</Othr>
</Id>
</DbtrAcct>
<DbtrAgt>
<FinInstnId>
BICFI = WPACAU2S
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
BICFI = UOVBSGSG
</FinInstnId>
</CdtrAgt>
<Cdtr>
Nm = ATLAS MARINE SERVICES PTE
<PstlAdr>
ADRLINE = 2/8 CHIA PING RD
AdrLine = 3/SG/SINGAPORE
</PstlAdr>
</Cdtr>
<CdtrAcct>
<Id>
<Othr>
Id = AMS852147657
</Othr>
</Id>
</CdtrAcct>
<RmtInf>
Ustrd = /ROC/PACS008ENDTOENDID-111
</RmtInf>
</CdtTrfTxInf>
</FIToFICstmrCdtTrf>
""";
String outputXml = convertToXml(inputText);
[Link](outputXml); // Print the result line by line
}
}