使用jdom進行xml解析,網絡抓包
阿新 • • 發佈:2018-03-23
input getname 報文格式 put blog 比對 sta div 外部
最近再做一個項目,使用到了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解析,網絡抓包