博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用jdom进行xml解析,网络抓包
阅读量:5343 次
发布时间:2019-06-15

本文共 4950 字,大约阅读时间需要 16 分钟。

最近再做一个项目,使用到了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
parseXMlStr(String xmlStr, String xmlPath) { Map
dataMap = new HashMap
(); // 创建一个新的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("-----捕获到的报文-----\n" + 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
dataMap) { Map
caseMap = new HashMap
(); 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); }}

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

转载于:https://www.cnblogs.com/javallh/p/8627526.html

你可能感兴趣的文章
linux下编译复数类型引发的错误:expected unqualified-id before '(' token
查看>>
codeforces 1041A Heist
查看>>
字典常用方法
查看>>
Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)
查看>>
bzoj1048 [HAOI2007]分割矩阵
查看>>
Java中的编码
查看>>
PKUWC2018 5/6
查看>>
As-If-Serial 理解
查看>>
洛谷P1005 矩阵取数游戏
查看>>
在Silverlight中使用HierarchicalDataTemplate为TreeView实现递归树状结构
查看>>
无线通信基础(一):无线网络演进
查看>>
如何在工作中快速成长?阿里资深架构师给工程师的10个简单技巧
查看>>
WebSocket 时时双向数据,前后端(聊天室)
查看>>
关于python中带下划线的变量和函数 的意义
查看>>
linux清空日志文件内容 (转)
查看>>
安卓第十三天笔记-服务(Service)
查看>>
Servlet接收JSP参数乱码问题解决办法
查看>>
【bzoj5016】[Snoi2017]一个简单的询问 莫队算法
查看>>
Ajax : load()
查看>>
MySQL-EXPLAIN执行计划Extra解释
查看>>