• 使用jdom进行xml解析,网络抓包


    最近再做一个项目,使用到了jdom进行xml解析,为了方便记忆,现在保存在这里

    package bboss;
    
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.io.StringReader;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    
    import org.apache.log4j.Logger;
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.input.SAXBuilder;
    import org.junit.Test;
    import org.xml.sax.InputSource;
    
    /**
     * @author 吕龙虎
     */
    public class ParseSoapXml {
    	public static Logger logger1 = Logger.getLogger(ParseXMLToListUtil.class);
    
    	/**
    	 * 报文解析
    	 * 
    	 * @param xmlStr
    	 * @param xmlPath
    	 * @return
    	 */
    	// 外部调用此方法必须保证xmlPath为空
    	public static Map<String, String> parseXMlStr(String xmlStr, String xmlPath) {
    		Map<String, String> dataMap = new HashMap<String, String>();
    		// 创建一个新的SAXBuilder
    		System.out.println("-----------------------准备开始解析数据包-------------------------");
    		if ((xmlStr != null && xmlStr != "") || (xmlPath != null && xmlPath != "")) {
    			SAXBuilder sb = new SAXBuilder();
    			logger1.info("------开始解析数据包中报文数据------");
    			try {
    				Document doc = null;
    				if (xmlStr != null && (xmlPath == null || xmlPath == "")) {
    					// 创建一个新的字符串
    					StringReader read = new StringReader(xmlStr);
    					// 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
    					InputSource source = new InputSource(read);
    					// 如果报文格式出错,抛出异常,doc为空
    					doc = sb.build(source);
    				} else if ((xmlStr == null || xmlStr == "") && xmlPath != null) {
    					InputStream source = new FileInputStream(xmlPath);
    					doc = sb.build(source);
    				}
    				// 报文格式出错,doc为空
    				if (doc != null) {
    					Element root = doc.getRootElement();// 获取根节点
    					List<?> list = root.getChildren();// 获取第一个子节点
    					if (list.size() != 0) {
    						for (int i = 0; i < list.size(); i++) {
    							Element el = (Element) list.get(i);
    							List<?> elist = el.getChildren();// 获取子节点下的节点
    							if (elist.size() != 0) {
    								for (int j = 0; j < elist.size(); j++) {
    									Element elm = (Element) elist.get(j);
    									List<?> ellist = elm.getChildren();
    									if (ellist.size() != 0) {
    										for (int k = 0; k < ellist.size(); k++) {
    											Element elmt = (Element) ellist.get(k);
    											logger1.info("节点名:" + elmt.getName() + "节点值:" + elmt.getText());
    											dataMap.put(elmt.getName(), elmt.getText());// 添加数据至集合里以便比对
    										}
    									} else {
    										logger1.info("节点名:" + elm.getName() + "节点值:" + elm.getText());
    										dataMap.put(elm.getName(), elm.getText());// 添加数据至集合里以便比对
    									}
    								}
    							} else {
    								logger1.info("节点名:" + el.getName() + "节点值:" + el.getText());
    								dataMap.put(el.getName(), el.getText());// 添加数据至集合里以便比对
    							}
    						}
    
    					} else {
    						dataMap.put(root.getName(), "");
    					}
    					// 将解析后的dataMap拿出来准备比对确保xmlPath为空,即保证第一次进入
    					if (dataMap.size() != 0 && (xmlPath == null || xmlPath == "")) {
    						compareXml(dataMap);
    					}
    					System.out.println("------结束解析数据包中报文数据------");
    				} else {
    					if (xmlStr != null && xmlPath == null) {
    						logger1.info("-----捕获到的报文-----
    " + xmlStr);
    						System.out.println("------捕获报文有异常------");
    					} else if (xmlStr == null && xmlPath != null) {
    						logger1.info("-----原比对报文所在路径-----" + xmlPath);
    						System.out.println("------比对报文有异常------");
    					}
    
    				}
    			} catch (Exception e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		} else {
    			System.out.println("------未捕获到任何数据------");
    		}
    		return dataMap;
    	}
    
    	/**
    	 * 开始比较
    	 */
    	public static void compareXml(Map<String, String> dataMap) {
    		Map<String, String> caseMap = new HashMap<String, String>();
    		Iterator<?> it = dataMap.entrySet().iterator();
    		System.out.println("-----比对数据包开始解析-----");
    		String xmlPath = null;
    		while (it.hasNext()) {
    			Entry<?, ?> entry = (Entry<?, ?>) it.next();
    			if (entry.getKey().equals("保密")) {
    				if (entry.getValue().equals("保密")) {
    					System.out.println("------找到匹配报文“个”------");
    					xmlPath = "src/xml/个.txt";
    					caseMap = parseXMlStr(null, xmlPath);
    					break;
    				} 
    				else if (entry.getValue().equals("保密")) {
    					System.out.println("------找到匹配报文“个”------");
    					xmlPath = "src/xml/个.txt";
    					caseMap = parseXMlStr(null, xmlPath);
    					break;
    				} 
    				else if (entry.getValue().equals("保密")) {
    					System.out.println("------找到匹配报文“Jqk”------");
    					xmlPath = "src/xml/Jqk.txt";
    					caseMap = parseXMlStr(null, xmlPath);
    					break;
    				} 
    				else if (entry.getValue().equals("保密")) {
    					System.out.println("------找到匹配报文“反馈”------");
    					xmlPath = "src/xml/反馈.txt";
    					caseMap = parseXMlStr(null, xmlPath);
    					break;
    				}
    			}
    			/*
    			 * else { xmlPath="src/xml/报文.txt"; caseMap = parseXMlStr(null,xmlPath);
    			 * break; }
    			 */
    			/*
    			 * else if(true){ xmlPath="src/xml/报文.txt"; caseMap =
    			 * parseXMlStr(null,xmlPath); } else if(true){ xmlPath="src/xml/Pt";
    			 * caseMap = parseXMlStr(null,xmlPath); }
    			 */
    		}
    		if (caseMap.size() != 0) {
    			CompareXMLUtil.compareXml(caseMap, dataMap);
    		} else {
    			System.out.println("-----找不到与之匹配的数据包类型-----");
    		}
    	}
    
    	@Test
    	public void testMain() {
    		String soap = "保密";
    		parseXMlStr(soap, null);
    	}
    }
    

      由于有保密协议,所以中间涉及到的都为保密状态。

  • 相关阅读:
    【SQL】在含有GROUP BY的SELECT语句中如何显示COUNT()为0的结果
    【SQL】SQL分页查询总结
    开篇
    Android Native Crash 排查思路
    jmeter+ant+jenkins接口自动化测试框架
    为何推荐使用线程池而不是显式创建线程原因之一—至少让线程有范围和限制
    quartz 中的线程池
    select in 查询结果无顺序及解决办法
    Druid 数据库连接池如何根据url加载Driver
    java 线程池参数
  • 原文地址:https://www.cnblogs.com/javallh/p/8627526.html
Copyright © 2020-2023  润新知