xml解析,基于dom4j

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_42356666/article/details/83412433

一,封装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节点的值        
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42356666/article/details/83412433
今日推荐