1. 程式人生 > >使用jdom進行xml解析,網絡抓包

使用jdom進行xml解析,網絡抓包

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解析,網絡抓包