最近再做一个项目,使用到了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("-----捕获到的报文-----\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<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);
}
}

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

使用jdom进行xml解析,网络抓包的更多相关文章

  1. CatchPacket网络抓包软件

    CatchPacket网络抓包软件  qq  22945088431.技术特点:基于WinPcap库,c# winform2.实现获取机器所有网卡,可任意选择监听3.可以捕获常见网络协议arp dns ...

  2. python编写网络抓包分析脚本

    python编写网络抓包分析脚本 写网络抓包分析脚本,一个称手的sniffer工具是必不可少的,我习惯用Ethereal,简单,易用,基于winpcap的一个开源的软件 Ethereal自带许多协议的 ...

  3. [转载]Fiddler 解析!抓包抓得好真的可以为所欲为 [一]

    说起抓包,很多人以为就是用个工具,简简单单地抓一下就可以了.昨天在面试一个安卓逆向,直接告诉我[抓包没有技术含量].在这里,我必须发一个教程,解析一下抓包神器——Fiddler.Fiddler仅仅是一 ...

  4. 开源网络抓包与分析框架学习-Packetbeat篇

    开源简介packbeat是一个开源的实时网络抓包与分析框架,内置了很多常见的协议捕获及解析,如HTTP.MySQL.Redis等.在实际使用中,通常和Elasticsearch以及kibana联合使用 ...

  5. 超详细的网络抓包神器 tcpdump 使用指南

    原文链接:Tcpdump 示例教程 本文主要内容翻译自<Tcpdump Examples>. tcpdump 是一款强大的网络抓包工具,它使用 libpcap 库来抓取网络数据包,这个库在 ...

  6. 网络抓包wireshark(转)

    转自 网络抓包wireshark   抓包应该是每个技术人员掌握的基础知识,无论是技术支持运维人员或者是研发,多少都会遇到要抓包的情况,用过的抓包工具有fiddle.wireshark,作为一个不是经 ...

  7. 跨平台网络抓包工具-Microsoft Message Analyzer

    Microsoft Message Analyzer (MMA 2013)是微软最受欢迎的Netmon的最新版本. 在Netmon网络跟踪和排除故障功能的基础上提供了更强大的跨平台网络分析追踪能力.园 ...

  8. Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布

    来自官方日志的喜悦 被誉为全新开始的消息分析器时代,由MMA为您开启,博客原文写的很激动,大家可以点击这里浏览:http://blogs.technet.com/b/messageanalyzer/a ...

  9. 网络抓包工具-Wireshark学习资料

    wireshark一个非常牛逼的网络抓包工具.转载一系列博文 一站式学习Wireshark(一):Wireshark基本用法 一站式学习Wireshark(二):应用Wireshark观察基本网络协议 ...

随机推荐

  1. webpack2利用插件clean-webpack-plugin来清除dist文件夹中重复的文件

    配置文件如下 /** * Created by oufeng on 2017/5/6. */ const webpack = require('webpack'); const path = requ ...

  2. python之while循环/格式化输出/运算符/初始编码/成员变量

    一.主要内容:1.while 循环 (难点)while 条件: 循环体 break: 直接跳出循环continue:停止当前本次循环,继续执行下一次循环.不会中断循环能让循环退出:(1)break ( ...

  3. Ubuntu中针对问题 E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)的解决方案

    一.问题描述: 在ubuntu中有时因为错误的操作,而导致在执行 sudo apt-get install xxxx出现如下错误: E: Could not get lock /var/lib/dpk ...

  4. 使用 NGINX 流控和 fail2ban 防止 CC 攻击

    背景知识 CC 攻击 攻击者通过创建大量请求导致服务器资源耗尽,主要针对特定服务接口,属于实现 DoS 攻击的一种方式(DoS 攻击更多是针对网络端口,而不是具体服务接口). NGINX 流控 lim ...

  5. recovery uncrypt功能解析(bootable/recovery/uncrypt/uncrypt.cpp)

    我们通常对一个文件可以直接读写操作,或者普通的分区(没有文件系统)也是一样,直接对/dev/block/boot直接读写,就可以获取里面的数据内容了. 当我们在ota升级的时候,把升级包下载到cach ...

  6. 我的简历 PHP Java C# 技术总监

          石先生 ID:303321266 目前正在找工作 13611326258 hr_msn@163.com 男|32 岁 (1985/08/06)|现居住北京-海淀区|12年工作经验     ...

  7. Asp.Net WebApi Post请求整理(一)

    Asp.Net WebApi+JQuery Ajax的Post请求整理 一.总结 1.WebApi 默认支持Post提交处理,返回的结果为json对象,前台不需要手动反序列化处理.2.WebApi 接 ...

  8. 利用PCA进行故障监测

    利用PCA进行故障监测,传统的统计指标有两种:Hotelling-T2和平方预测误差(Squared prediction error, SPE).T2统计量反映了每个主成分在变化趋势和幅值上偏离模型 ...

  9. Linux 小知识翻译 - 「TCP/IP」

    上次说了「协议」相关的话题,这次专门说说「TCP/IP」协议. 这里的主题是「TCP/IP」到底是什么?但并不是要说明「TCP/IP」是什么东西,重点是「TCP/IP」究竟有什么意义,在哪里使用「TC ...

  10. 个人技术博客--团队Git规范(参考西瓜学长)

    援引西瓜学长:GitHub团队项目合作流程 废话少说直接写 1.fork 1.对于组员来说第一步就是fork 2.点击fork之后 上面是我们的团队仓库 切换回自己的仓库 就会看到 是fork于团队仓 ...