Какой из них имеет лучшую производительность для создания Xml String, Jaxb или StringBuffer?

Я должен создать следующую строку xml,

<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-строк с использованием 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-строки с использованием 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. Какой из них лучше с точки зрения производительности JAXB и StringBuffer?

2. Также предлагаете другие методологии помимо двух выше?

2 ответа

Недостаточная читаемость кода StringBuffer. Посмотрите на StAX (XMLStreamWriter).


Ну, если это односторонняя операция, и если XML такой же простой, как в вопросе, и не меняется во времени, то JAXB не имеет шансов с точки зрения производительности, StringBuffer намного быстрее.

licensed under cc by-sa 3.0 with attribution.