使用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("-----捕获到的报文-----\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); } }
由于有保密协议,所以中间涉及到的都为保密状态。
llh