有关xml格式报文的拼装和解析,主要是利用jdom包。
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.1</version>
</dependency>
pom依赖取自: http://www.mvnrepository.com/
引用的类:
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
首先定义元素:
<span style="white-space:pre"> </span>private static Element service,
service_Header,
<span style="white-space:pre"> </span>service_id,
<span style="white-space:pre"> </span>requester_id,
<span style="white-space:pre"> </span>branch_id,
<span style="white-space:pre"> </span>channel_id,
<span style="white-space:pre"> </span>version_id,
<span style="white-space:pre"> </span>service_time,
<span style="white-space:pre"> </span>service_sn,
service_Body,
<span style="white-space:pre"> </span>request,
func,
cust_acct_no,
cust_name,
flg1,
cert_typ,
cert_id,
chk_pwd,
pswd,
sec_mt_con,
flg3;
然后建立元素和嵌套:
private static void buildElement() throws Exception{
//定义
service = new Element("Service");
service_Header = new Element("Service_Header");
service_id = new Element("service_id");
requester_id = new Element("requester_id");
branch_id = new Element("branch_id");
channel_id = new Element("channel_id");
version_id = new Element("version_id");
service_time = new Element("service_time");
service_sn = new Element("service_sn");
service_Body = new Element("Service_Body");
request = new Element("request");
func = new Element("FUNC");
cust_acct_no = new Element("CUST-ACCT-NO");
cust_name = new Element("CUST-NAME");
flg1 = new Element("FLG1");
cert_typ = new Element("CERT-typ");
cert_id = new Element("CERT-ID");
chk_pwd = new Element("CHK-PWD");
pswd = new Element("PSWD");
sec_mt_con = new Element("SEC-MT-CON");
flg3 = new Element("FLG3");
//组装
service.addContent(service_Header);
service.addContent(service_Body);
service_Header.addContent(service_id);
service_Header.addContent(requester_id);
service_Header.addContent(branch_id);
service_Header.addContent(channel_id);
service_Header.addContent(version_id);
service_Header.addContent(service_time);
service_Header.addContent(service_sn);
service_Body.addContent(request);
request.addContent(func);
request.addContent(cust_acct_no);
request.addContent(cust_name);
request.addContent(flg1);
request.addContent(cert_typ);
request.addContent(cert_id);
request.addContent(chk_pwd);
request.addContent(pswd);
request.addContent(sec_mt_con);
request.addContent(flg3);
}
接着是赋值方法:
<span style="white-space:pre"> </span>public static void setElement(BankInfo bankinfo) throws Exception{
//header
service_id.addContent(bankinfo.getService_idStr());
requester_id.addContent(bankinfo.getRequester_idStr());
branch_id.addContent(bankinfo.getBranch_idStr());
channel_id.addContent(bankinfo.getChannel_idStr());
version_id.addContent(bankinfo.getVersion_idStr());
service_time.addContent(bankinfo.getService_timeStr());
service_sn.addContent(bankinfo.getService_snStr());
//body request
func.addContent(bankinfo.getFuncStr());
cust_acct_no.addContent(bankinfo.getCust_acct_noStr());
cust_name.addContent(bankinfo.getCust_nameStr());
flg1.addContent(bankinfo.getFlg1Str());
cert_typ.addContent(bankinfo.getCert_typStr());
cert_id.addContent(bankinfo.getCert_idStr());
chk_pwd.addContent(bankinfo.getChk_pwdStr());
pswd.addContent(bankinfo.getPswdStr());
sec_mt_con.addContent(bankinfo.getSec_mt_conStr());
flg3.addContent(bankinfo.getFlg3Str());
}
最后是调用方法呐:
<span style="white-space:pre"> </span>public synchronized static String getXMLStr(BankInfo bankinfo) {
String outString = "";
String resultStr = "";
try{
buildElement();
setElement(bankinfo);
}catch(Exception e){
e.printStackTrace();
}
Document myDocument = new Document();
myDocument.addContent(service);
try{
Format format = Format.getPrettyFormat();
format.setEncoding("GB2321");
format.setExpandEmptyElements(true);
XMLOutputter xmlOut = new XMLOutputter(format);
outString = xmlOut.outputString(myDocument);
resultStr = outString.substring(outString.indexOf("\n")+1);//用于截去第一段引用
}catch(Exception e) {
e.printStackTrace();
}
return resultStr;
}
这样就完成了,试一试:
public static void main(String[] args) {
/* getXmlStr() 测试 */
BankInfo bankInfo = new BankInfo();
String xmlString = "";
xmlString = Jxml.getXMLStr(bankInfo);
System.out.println(xmlString);
}
结果:
<?xml version="1.0" encoding="GB2321"?>
<Service>
<Service_Header>
<service_id>00260001004006</service_id>
<requester_id>0018</requester_id>
<branch_id>802777777</branch_id>
<channel_id>01</channel_id>
<version_id>01</version_id>
<service_time></service_time>
<service_sn></service_sn>
</Service_Header>
<Service_Body>
<request>
<FUNC></FUNC>
<CUST-ACCT-NO></CUST-ACCT-NO>
<CUST-NAME></CUST-NAME>
<FLG1></FLG1>
<CERT-typ></CERT-typ>
<CERT-ID></CERT-ID>
<CHK-PWD></CHK-PWD>
<PSWD></PSWD>
<SEC-MT-CON></SEC-MT-CON>
<FLG3></FLG3>
</request>
</Service_Body>
</Service>
这样就急用jdom拼装出xml格式报文。
解析:
byte[] rb = ...
logger.info("接收的报文:" + new String(rb,"GB2312"));
SAXBuilder builder = new SAXBuilder();
Document myDocument;
StringReader sr = new StringReader(new String(rb,"GB2312"));
InputSource is = new InputSource(sr);
myDocument =builder.build(is);
Element ini = myDocument.getRootElement();
ini.getChild("head").getChildText("ans_no");
rb为接收到的报文,这样就获取<head>下的<ans_no>的内容。
这为工作上用到的,没有深入的再去了解,欢迎指教。