版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
一,封装xml。
1.xml格式的报文一般分为根节点,父节点节点和子节点,一般为先创建一个Document,设置其setXMLEncoding为utf-16,然后添加根节点,在根节点后添加子节点。
Document doc= DocumentHelper.createDocument();//创建Document doc.setXMLEncoding("utf-16"); Element rootElement=doc.addElement("REQUEST");//添加根节点rootElement.addElement("SERVICENAME").addText("GETDEPTLIST");//添加子节点,设置节点值 <REQUEST><SERVICENAME>GETDEPTLIST</SERVICENAME></REQUEST>
2.如果一个父节点(list)下面有多个子节点(item),利用如下方式进行创建,如果存在多个item,则在第二三行加个for循环。
Element jsList=rootElement.addElement("JSLIST"); Element jsItem=jsList.addElement("JS"); jsItem.addElement("JSKLB").addText("117");
<REQUEST>
<SERVICENAME>REGIST</SERVICENAME>
<OPERATORNO>00002</OPERATORNO>
<VERSION>1.0</VERSION>
<TRADESERIALNUMBER>201904030123</TRADESERIALNUMBER>
<CZFS>3</CZFS>
<CZJLID></CZJLID>
<HM>56</HM>
<HX>87</HX>
<JKFS>0</JKFS>
<YYSJ>2019-04-02 16:45:00</YYSJ>
<JE>3.4</JE>
<JSLIST>
<JS>
<JSKLB>117</JSKLB>
<JSKH>54321</JSKH>
<JYSM>12345</JYSM>
<JYLSH>交易11111流水号</JYLSH>
<JSFS>证通银联卡</JSFS>
<JSJE>3.4</JSJE>
<ZY>摘要</ZY>
<SFCYJ></SFCYJ>
<SFXFK></SFXFK>
<EXPENDLIST>
<EXPEND>
<JYMC>交易名称</JYMC>
<JYLR>交易内容</JYLR>
</EXPEND>
</EXPENDLIST>
</JS>
</JSLIST>
<HZDW>合作单位</HZDW>
<YYFS>预约方式</YYFS>
<BRID>56942</BRID>
<SFZH></SFZH>
<XM>刘杨斌</XM>
<BRLX></BRLX>
<FB></FB>
<JQM></JQM>
</REQUEST>
创建上述报文:
/**
* 提交挂号请求处理
* @param registerSubmitReq
* @return
*/
public static String registerSubmitReq(RegisterSubmitReq registerSubmitReq,String name){
String requestId= UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
String jkfs="1";
if(!"".equals(registerSubmitReq.amount)){
jkfs="0";
}
Document doc= DocumentHelper.createDocument();
doc.setXMLEncoding(Constant.XMLEncoder16);
Element rootElement=doc.addElement("REQUEST");
rootElement.addElement("SERVICENAME").addText("REGIST");//服务名
rootElement.addElement("OPERATORNO").addText("0001");//操作员编号
rootElement.addElement("VERSION").addText("1.0");//版本号
rootElement.addElement("TRADESERIALNUMBER").addText(requestId);//交易流水号
rootElement.addElement("CZFS").addText("3");//
rootElement.addElement("CZJLID").addText("");//出诊记录ID
rootElement.addElement("HM").addText(registerSubmitReq.scheduleId);//号码
rootElement.addElement("HX").addText("");//号序
rootElement.addElement("JKFS").addText(jkfs);//缴款方式(0-挂号或预约缴款;1-预约不缴款)
rootElement.addElement("YYSJ").addText(registerSubmitReq.regDate);//预约时间,格式(YYYY-MM-DD hh24:mi:ss)
rootElement.addElement("JE").addText(registerSubmitReq.amount);//结算金额
Element jsList=rootElement.addElement("JSLIST");
List<PaymentItemDto> paymentList=registerSubmitReq.paymentList;
for(PaymentItemDto paymentItemDto:paymentList){
Element jsItem=jsList.addElement("JS");
jsItem.addElement("JSKLB").addText("117");//结算卡类别
jsItem.addElement("JSKH").addText(paymentItemDto.cardNo);//结算卡号
jsItem.addElement("JYSM").addText("");//交易说明
jsItem.addElement("JYLSH").addText(paymentItemDto.outTradeNo);//交易流水号(保证每次调用都唯一)
jsItem.addElement("JSFS").addText("证通银联卡");//结算方式
jsItem.addElement("JSJE").addText(String.valueOf(paymentItemDto.payAmount));//结算金额
jsItem.addElement("ZY").addText("");//摘要
jsItem.addElement("SFCYJ").addText("");
jsItem.addElement("SFXFK").addText("");
Element expendList=jsItem.addElement("EXPANDLIST");
Element expendItem=expendList.addElement("EXPAND");
expendItem.addElement("JYMC").addText("");//交易名称
expendItem.addElement("JYLR").addText("");//交易内容
}
rootElement.addElement("HZDW").addText("");//合作单位
rootElement.addElement("YYFS").addText("");//预约方式
rootElement.addElement("BRID").addText(registerSubmitReq.patientID);//病人ID
rootElement.addElement("SFZH").addText("");//身份证号码
rootElement.addElement("XM").addText(name);//姓名Y
rootElement.addElement("BRLX").addText("");//如果是医保病人,则传“医保病人”
rootElement.addElement("FB").addText("");//费别(根据优惠人群接口获取的费别,如果没有传空)
rootElement.addElement("JQM").addText("");//机器码,用于区分不同终端或帐户操作。以固定前缀+用户注册帐号作为机器码
return doc.asXML();
}
二。解析xml
1.给定一个xml格式的string字符串(outXml),解析节点的值,首先将字符串转换为一个Document,获得Document的根节点。
Document doc= DocumentHelper.parseText(outXml); Element rootElement=doc.getRootElement();//获得根节点 Element zlertElement=rootElement.element("ZLEPR");//获得根节点下面得子节点
如果子节点是一个父节点,父节点下面有多个item,可以利用迭代器获得父节点下的子节点。
Element elements=rootElement.element("HBLIST");//获取父节点 if(elements!=null){ Iterator<Element> it=elements.elementIterator("HB");//获取子节点 while (it.hasNext()){//循环子节点 Element element=it.next(); String FWMC=element.elementText("FWMC");获得子节点下的FWMC节点的值 } }