dom4j解析xml报文

本文详细介绍了如何利用dom4j库解析XML报文,从接收报文实体类的设计到具体的解析实现,再到测试用例的验证,全方位阐述了整个过程。
摘要由CSDN通过智能技术生成

解析报文格式:

<?xml version="1.0" encoding="UTF-8"?>
<InterBOSS>
	 <Version>0100</Version>
	 <TestFlag>0</TestFlag>
	 <BIPType>
		 <BIPCode>BIPNX001</BIPCode>
		 <ActivityCode>123456</ActivityCode>
		 <ActionCode>0</ActionCode>
	 </BIPType>
	 <RoutingInfo>
		 <OrigDomain>BOSS</OrigDomain>
		 <RouteType>00</RouteType>
		 <Routing>
			 <HomeDomain>ZFPT</HomeDomain>
			 <RouteValue>951</RouteValue>
		 </Routing>
	 </RoutingInfo>
	 <TransInfo>
		 <SessionID>951190122033358560</SessionID>
		 <TransIDO>P951T20190122095952S358560</TransIDO>
		 <TransIDOTime>20190122095952</TransIDOTime>
	 </TransInfo>
	 <SvcCont>
		 <![CDATA[<?xml version="1.0" encoding="UTF-8"?>
		 <TestReqs>
			 <serviceNumber>456</serviceNumber>
			 <Seq>123</Seq>
		 </TestReqs>]]>
 </SvcCont>

接受报文实体类:

报文解析类:

package cn.shijinshi.service;
 
 
 import org.dom4j.Document;
 import org.dom4j.DocumentHelper;
 import org.dom4j.Element;
 import org.springframework.stereotype.Service;
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Iterator;
 
 /**
  * 报文解析
  *
  * @param <T>
  */
 @Service
 public class XmlMsgRspService<T> {
 
     /**
      * 报文解析 节点SvcCont
      * @param xml
      * @param clazz
      * @return
      * @throws Exception
      */
     public <T> T parsingXML(String xml,Class<T> clazz) throws Exception {
         Constructor<T> constructor = clazz.getConstructor();
         T m = constructor.newInstance();
         Method[] methods = clazz.getMethods();
         Field[] declaredFields = clazz.getDeclaredFields();
 
         Class superclass = clazz.getSuperclass();
         Method[] methods1 = superclass.getMethods();
         Field[] declaredFields1 = superclass.getDeclaredFields();
 
         Document document  = DocumentHelper.parseText(xml);
         Element rootElement = document.getRootElement();
         Iterator iterator = rootElement.elementIterator();
         nodeParsing(m, methods1, rootElement,declaredFields1);
         Element e = (Element)rootElement.selectNodes("SvcCont").get(0);
         String s = e.getStringValue();
         Document document1 = DocumentHelper.parseText(s);
         Element rootElement1 = document1.getRootElement();
         nodeParsing(m, methods, rootElement1,declaredFields);
         return m;
     }
 
     
 
     public void nodeParsing(Object m , Method[] methods, Element element, Field[] declaredFields) throws InvocationTargetException, IllegalAccessException, InstantiationException {
         parsingMsg(m, element, methods, declaredFields);
     }
 
     public Object parsingMsg(Object m,Element element,Method[] methods,Field[] declaredFields) throws InvocationTargetException, IllegalAccessException, InstantiationException {
         Iterator iteratorSvcCont = element.elementIterator();
         while (iteratorSvcCont.hasNext()){
             Element stu = (Element) iteratorSvcCont.next();
             Iterator<Element> elementIterator = stu.elementIterator();
             if("SvcCont".equals(stu.getName().substring(0, 1).toUpperCase() +  stu.getName().substring(1))){
                 continue;
             }
             if(elementIterator.hasNext()){
                 childNodes( m, methods, stu, declaredFields);
             }else {
                 setAttribute(m,stu,methods);
             }
         }
         return m;
     }
 
     public Object childNodes(Object m,Method[] methods,Element stu,Field[] declaredFields)throws InvocationTargetException, IllegalAccessException, InstantiationException {
         for (Field declaredField : declaredFields) {
             if(stu.getName().equals(declaredField.getName())){
                 Object obj = declaredField.getType().newInstance();
                 Field[] declaredFields1 = declaredField.getType().getDeclaredFields();
                 Method[] methods1 = declaredField.getType().getMethods();
                 Object o = parsingMsg(obj, stu, methods1, declaredFields1);
                 for (Method method : methods) {
                     if(method.getName().equals("set" +  stu.getName().substring(0, 1).toUpperCase() +  stu.getName().substring(1))){
                         String s = (String)method.invoke(m,o);
                     }
                 }
             }
         }
         return m;
     }
 
     public Object setAttribute(Object m,Element stu,Method[] methods)throws InvocationTargetException, IllegalAccessException{
         String stringValue = stu.getStringValue();
         for (Method method : methods) {
             if(method.getName().equals("set" +  stu.getName().substring(0, 1).toUpperCase() +  stu.getName().substring(1))){
                 String s = (String)method.invoke(m,stringValue);
             }
         }
         return m;
     }
 
     public boolean cherkBasicDataType(Class clazz){
         if(clazz.equals(String.class)||clazz.equals(int.class)||clazz.equals(long.class)||clazz.equals(double.class)
                 ||clazz.equals(char.class)||clazz.equals(byte.class)||clazz.equals(short.class)||clazz.equals(float.class)){
             return true;
         }
         return false;
     }
 
 
 }

测试:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值