package ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import .;
import org.;
import org.;
import org.;
import org.;
import org.;
import ;
/**
* 解析xml的工具类 1、将多层级xml解析为Map 2、将多层级xml解析为Json
*
* @author lmb
*
*/
public class ParseXmlUtil {
public static Logger logger = ();
/**
* 将xml格式响应报文解析为Json格式
*
* @param responseXmlTemp
* @return
* @throws IOException
* @throws JDOMException
* @throws DocumentException
*/
public static String xml2Json(String responseXmlTemp, JSONObject node, String currentNode, String listcurrentNode) throws JDOMException, IOException
{
InputSource source = new InputSource(new StringReader(()));
SAXBuilder builder = new SAXBuilder();
Document doc = null;
doc = (source);
Element rootElement = ();
Map<String, Object> mapXml = new TreeMap<String, Object>();
element2Map(mapXml, rootElement, node, currentNode, listcurrentNode);
String jsonXml = (mapXml).toString();
("Json >>> " + jsonXml);
return jsonXml;
}
/**
* 将xml格式响应报文解析为Json格式
*
* @param responseXmlTemp
* @return
* @throws IOException
* @throws JDOMException
*/
public static String xml2Json(String responseXmlTemp) throws JDOMException, IOException {
Document doc = null;
InputSource source = new InputSource(new StringReader(()));
SAXBuilder builder = new SAXBuilder();
doc = (source);
Element rootElement = ();
Map<String, Object> mapXml = new TreeMap<String, Object>();
element2Map(mapXml, rootElement);
String jsonXml = (mapXml).toString();
("Json >>> " + jsonXml);
return jsonXml;
}
/**
* 将xml格式响应报文解析为Map格式
*
* @param responseXmlTemp
* @param thirdXmlServiceBean
* @return
* @throws IOException
* @throws JDOMException
* @throws DocumentException
*/
public static Map<String, Object> xml2map(String responseXmlTemp, JSONObject node, String currentNode,
String listCurrentNode) throws JDOMException, IOException {
Document doc = null;
InputSource source = new InputSource(new StringReader(()));
SAXBuilder builder = new SAXBuilder();
doc = (source);
Element rootElement = ();
Map<String, Object> mapXml = new TreeMap<String, Object>();
element2Map(mapXml, rootElement, node, currentNode, listCurrentNode);
return mapXml;
}
public static Map<String, Object> xml2map(String responseXmlTemp) throws JDOMException, IOException {
Document doc = null;
InputSource source = new InputSource(new StringReader(()));
SAXBuilder builder = new SAXBuilder();
doc = (source);
Element rootElement = ();
Map<String, Object> mapXml = new TreeMap<String, Object>();
element2Map(mapXml, rootElement);
return mapXml;
}
/**
* 使用递归调用将多层级xml转为map
*
* @param map
* @param rootElement
*/
@SuppressWarnings( {"unchecked", "rawtypes"})
public static void element2Map(Map<String, Object> map, Element rootElement, JSONObject node, String currentNode,
String listcurrentNode) {
// 获得当前节点的子节点
List<Element> elements = ();
int elementsSize = ();
if (elementsSize == 0) {
// 没有子节点说明当前节点是叶子节点,直接取值
if ((currentNode) != null) {
if ((currentNode).keySet().toString().contains(())) {
((), ());
}
}
} else if (elementsSize == 1 && !(0).getName().equals(listcurrentNode) ) {
// 只有一个子节点说明不用考虑list的情况,继续递归
Map<String, Object> tempMap = new TreeMap<String, Object>();
if ((currentNode) != null) {
element2Map(tempMap, (0), (currentNode), (0).getName(),
listcurrentNode);
if ((currentNode).keySet().contains((0).getName())) {
((0).getName(), tempMap);
}
}
} else {
// 多个子节点的话就要考虑list的情况了,特别是当多个子节点有名称相同的字段时
Map<String, Object> tempMap = new TreeMap<String, Object>();
for (Element element : elements) {
((), null);
}
Set<String> keySet = ();
for (String string : keySet) {
Namespace namespace = (0).getNamespace();
List<Element> sameElements = (string);
// 如果同名的数目大于1则表示要构建list
int sameElementSize = ();
if (sameElementSize > 1) {
List<Map> list = new ArrayList<Map>();
for (Element element : sameElements) {
Map<String, Object> sameTempMap = new TreeMap<String, Object>();
if ((currentNode).keySet().toString().contains(string)) {
if ((currentNode) != null) {
element2Map(sameTempMap, element, (currentNode), string,
listcurrentNode);
(sameTempMap);
}
}
}
if ((currentNode).keySet().toString().contains(string)) {
if ((currentNode) != null) {
(string, list);
}
}
} else {
// 同名的数量不大于1直接递归
if (listcurrentNode != null) {
String[] strarr = (",");
for (int i = 0; i < ; i++) {
if (strarr[i].equals(string)) {
List<Map> list = new ArrayList<Map>();
for (Element element : sameElements) {
Map<String, Object> sameTempMap = new TreeMap<String, Object>();
if ((currentNode).keySet().toString().contains(string)) {
if ((currentNode) != null) {
element2Map(sameTempMap, element, (currentNode), string,
listcurrentNode);
(sameTempMap);
}
}
}
if ((currentNode).keySet().toString().contains(string)) {
if ((currentNode) != null) {
(string, list);
}
}
} else {
Map<String, Object> sameTempMap = new TreeMap<String, Object>();
if ((currentNode).keySet().toString().contains(string)) {
if ((currentNode) != null) {
element2Map(sameTempMap, (0), (currentNode),
string, listcurrentNode);
(string, sameTempMap);
}
}
}
}
} else {
Map<String, Object> sameTempMap = new TreeMap<String, Object>();
if ((currentNode).keySet().toString().contains(string)) {
if ((currentNode) != null) {
element2Map(sameTempMap, (0), (currentNode), string,
listcurrentNode);
(string, sameTempMap);
}
}
}
}
}
}
}
public static void element2Map(Map<String, Object> map, Element rootElement) {
// 获得当前节点的子节点
List<Element> elements = ();
int elementsSize = ();
if (elementsSize == 0) {
// 没有子节点说明当前节点是叶子节点,直接取值
// if((currentNode).keySet().toString().contains(())) {
((), ());
// }
} else if (elementsSize == 1) {
// 只有一个子节点说明不用考虑list的情况,继续递归
Map<String, Object> tempMap = new TreeMap<String, Object>();
element2Map(tempMap, (0));
// if((currentNode).keySet().contains((0).getName())) {
((0).getName(), tempMap);
// }
} else {
// 多个子节点的话就要考虑list的情况了,特别是当多个子节点有名称相同的字段时
Map<String, Object> tempMap = new TreeMap<String, Object>();
for (Element element : elements) {
((), null);
}
Set<String> keySet = ();
for (String string : keySet) {
Namespace namespace = (0).getNamespace();
List<Element> sameElements = (string);
// 如果同名的数目大于1则表示要构建list
int sameElementSize = ();
if (sameElementSize > 1) {
List<Map> list = new ArrayList<Map>();
for (Element element : sameElements) {
Map<String, Object> sameTempMap = new TreeMap<String, Object>();
element2Map(sameTempMap, element);
(sameTempMap);
}
(string, list);
} else {
// 同名的数量不大于1直接递归
Map<String, Object> sameTempMap = new TreeMap<String, Object>();
element2Map(sameTempMap, (0));
(string, sameTempMap);
}
}
}
}
@SuppressWarnings("unchecked")
public static void parseData(Map<?, ?> map,JSONObject jsonObject) {
if (() == 1) {
for (Object key : ()) {
Object value = (key);
if (().startsWith("[") && ().endsWith("]")) {
(key, value);
// List<?> list = (List<?>)value;
// Iterator<?> iterator = ();
// while(()){
// value = ();
// parseData((Map<String, Object>)value);
// }
// (key+" "+value);
} else if (!().startsWith("{") && !().endsWith("}")) {
if ((key) != null) {
if (!(key).toString().startsWith("[")
&& !(key).toString().endsWith("]")) {
(key, "" + ((String)key).toString() + "|"
+ (value).toString() + "");
} else {
(key, "\"" + ((String)key).toString() + "|"
+ (value).toString() + "\"");
}
} else {
(key, value);
}
} else {
parseData((Map<String, Object>)value,jsonObject);
}
}
} else {
for (Object key : ()) {
Object value = (key);
if (().startsWith("[") && ().endsWith("]")) {
// List<?> list = (List<?>)value;
// for(int i = 0;i < ();i++)
// {
// Map<String,Object> map1 = (Map<String, Object>) (i);
// parseData(map1);
// }
if ((key) != null) {
(key, "\"" + ((String)key).toString() + "|"
+ (value).toString() + "\"");
} else {
(key, value);
}
} else {
if (().startsWith("{") && ().endsWith("}")) {
parseData((Map<String, Object>)value,jsonObject);
}
}
}
}
}
}
// 获取一个xml文件
String textFromFile = ("");
//currentNode XML最大的那个key
//listcurrentNode 在xml中多个循环的数据
//两个相同的XML key值得value 会按|分割最里面数据得在最第一个,按此规则排列排列1|1|1|1
//调用 将xml解析为Map
Map<String, Object> resultMap =
ParseXmlUtil.xml2map(textFromFile, nodejson, currentNode, listcurrentNode);