最近再做一个项目,使用到了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);
}
}
由于有保密协议,所以中间涉及到的都为保密状态。