0

I have to create following xml string,

<TRX>
    <SVC>CheckoutStartSession</SVC>
    <PRJ>PRJ</PRJ>
    <CTY>ABC</CTY>
    <COM>Internet</COM>
    <CUR>DEF</CUR>
    <ORD>1234</ORD>
    <NET>1.0</NET>
    <TAX>0.0</TAX>
    <GRS>1.0</GRS>
    <SES>
        <SUU>SCHEME://IP:PORT/CONTEXT_PATH/SUU</SUU>
        <FAU>SCHEME://IP:PORT/CONTEXT_PATH/FAU</FAU>
        <STY>SCHEME://IP:PORT/CONTEXT_PATH/STY</STY>
        <CVI>Required</CVI>
        <ACT>AUTHORIZE</ACT>
        <LAN>en-US</LAN>
    </SES>
    <CUS>
        <CTP>PRIVATE</CTP>
        <FNM>PRATEEK</FNM>
    </CUS>
</TRX>

XML-String creation using JAXB

public class PGReqConfig {

    public static void main(String[] args) throws JAXBException {

        RequestSession sessionConfig = new RequestSession();
        sessionConfig.setSuccessNotifURL("SCHEME://IP:PORT/CONTEXT_PATH/SUU");
        sessionConfig.setFailureNotifURL("SCHEME://IP:PORT/CONTEXT_PATH/FAU");
        sessionConfig.setStyleSheetURL("SCHEME://IP:PORT/CONTEXT_PATH/STY");
        sessionConfig.setAction("AUTHORIZE");
        sessionConfig.setCvcInput("Required");
        sessionConfig.setLaguage("en-US");

        CustomerDetails customerData = new CustomerDetails();
        customerData.setCustomerType("PRIVATE");
        customerData.setFirstName("PRATEEK");

        TransactionRequest transactionConfig = new TransactionRequest();
        transactionConfig.setService("CheckoutStartSession");
        transactionConfig.setConsentMedium("Internet");
        transactionConfig.setProjectCode("PRJ");
        transactionConfig.setCountryCode("ABC");
        transactionConfig.setCurrencyCode("DEF");
        transactionConfig.setNet("1.0");
        transactionConfig.setTax("0.0");
        transactionConfig.setGross("1.0");
        transactionConfig.setOrderId("1234");
        transactionConfig.setCustomerData(customerData);
        transactionConfig.setPaymentSession(sessionConfig);

        StringWriter xmlData = new StringWriter();

        JAXBContext context = JAXBContext.newInstance(TransactionRequest.class);
        Marshaller marshal = context.createMarshaller();
        marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshal.setProperty(Marshaller.JAXB_FRAGMENT, true);
        marshal.marshal(transactionConfig, xmlData);

        System.out.println(xmlData.toString());
    }

}

@XmlRootElement(name = "TRX")
@XmlAccessorType(XmlAccessType.FIELD)
class TransactionRequest{
    @XmlElement(name = "SVC")
    private String service;

    @XmlElement(name = "PRJ")
    private String projectCode;

    @XmlElement(name = "CTY")
    private String countryCode;

    @XmlElement(name = "COM")
    private String consentMedium;

    @XmlElement(name = "CUR")
    private String currencyCode;

    @XmlElement(name = "ORD")
    private String orderId;

    @XmlElement(name = "NET")
    private String netAmount;

    @XmlElement(name = "TAX")
    private String taxAmount;

    @XmlElement(name = "GRS")
    private String grossAmount;

    @XmlElement(name = "SES")
    private RequestSession paymentSession;

    @XmlElement(name = "CUS")
    private CustomerDetails customerData;

    ......

}

@XmlAccessorType(XmlAccessType.FIELD)
class RequestSession{

    @XmlElement(name = "SUU")
    private String successNotifURL;

    @XmlElement(name = "FAU")
    private String failureNotifURL;

    @XmlElement(name = "STY")
    private String styleSheetURL;

    @XmlElement(name = "CVI")
    private String cvcInput; 

    @XmlElement(name = "ACT")
    private String action; 

    @XmlElement(name = "LAN")
    private String laguage;

    ......
}

@XmlAccessorType(XmlAccessType.FIELD)
class CustomerDetails{

    @XmlElement(name = "CTP")
    private String customerType; 

    @XmlElement(name = "FNM")
    private String firstName;

    ......
}

XML-String creation using StringBuffer

StringBuffer trxTag = new StringBuffer();
trxTag.append("<TRX>" + "<SVC>CheckoutStartSession</SVC>");
trxTag.append("<PRJ>PRJ</PRJ>");
trxTag.append("<CTY>ABC</CTY>");
trxTag.append("<COM>Internet</COM>");
trxTag.append("<CUR>DEF</CUR>");

StringBuffer cusTag = new StringBuffer("<CUS>");
cusTag.append("<CTP>Private</CTP>")
        .append("<FNM>PRATEEK</FNM>")
        .append("</CUS>");

StringBuffer sesTag = new StringBuffer("<SES>");
sesTag.append("<SUU>SCHEME://IP:PORT/CONTEXT_PATH/SUU</SUU>")
        .append("<FAU>SCHEME://IP:PORT/CONTEXT_PATH/FAU</FAU>")
        .append("<STY>SCHEME://IP:PORT/CONTEXT_PATH/STY</STY>")
        .append("<CVI>Required</CVI>")
        .append("<LAN>en-US</LAN>")
        .append("<ACT>Authorize</ACT>" + "</SES>");

trxTag.append("<ORD>1234</ORD>")
        .append("<NET>1.0</NET>")
        .append("<TAX>0.0</TAX>")
        .append("<GRS>1.0</GRS>")
        .append(cusTag)
        .append(sesTag)
        .append("</TRX>");

System.out.println(trxTag.toString());

1. Which one is better in terms of performance out of JAXB and StringBuffer ?

2. Also suggest other methodologies apart from above two ?

Prateek
  • 12,014
  • 12
  • 60
  • 81
  • this question should help you http://stackoverflow.com/questions/373833/best-xml-parser-for-java – Jeremy Nov 15 '13 at 06:12

2 Answers2

1

StringBuffer code readability is poor. Look on StAX (XMLStreamWriter).

pasha701
  • 6,831
  • 1
  • 15
  • 22
0

Well, if this is one-way operation and if XML is as simple as in the question and doesn't change in time, then JAXB has no chance in terms of performance, StringBuffer is much faster.

andbi
  • 4,426
  • 5
  • 45
  • 70
  • yes,only name and amount will change,except that entire xml is same.also it may be accessed by many users at a time – Prateek Nov 15 '13 at 06:32