package com.people.xmlToSql;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import org.jdom.Document;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
/**
* 讀取一個xml文件返回string
* @author lmb
*
*/
public class T {
/**
* 加載xml文件
* @return Document
*/
public static Document load(){
Document document=null;
String url="E://QQ//batch2.xml";
try {
SAXBuilder reader = new SAXBuilder();
document=reader.build(new File(url));
} catch (Exception e) {
e.printStackTrace();
}
return document;
}
/**
* 將xml文件轉換為String串
* @return
*/
public static String XmlToString(){
Document document=null;
document=load();
Format format =Format.getPrettyFormat();
format.setEncoding("UTF-8");//設置編碼格式
StringWriter out=null; //輸出對象
String sReturn =""; //輸出字符串
XMLOutputter outputter =new XMLOutputter();
out=new StringWriter();
try {
outputter.output(document,out);
} catch (IOException e) {
e.printStackTrace();
}
sReturn=out.toString();
return sReturn;
}
}
package com.people.xmlToSql;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.sf.json.JSONObject;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Namespace;
import org.dom4j.QName;
/**
* 解析xml的工具類
* 1、將多層級xml解析為Map
* 2、將多層級xml解析為Json
*
* @author lmb
*
*/
public class T1 {
public static Logger logger = Logger.getLogger(T1.class);
public static void main(String[] args) {
// 獲取一個xml文件
String textFromFile = T.XmlToString();
//將xml解析為Map
// Map resultMap = xml2map(textFromFile);
//將xml解析為Json
String resultJson = xml2Json(textFromFile);
}
/**
* 將xml格式響應報文解析為Json格式
* @param responseXmlTemp
* @return
*/
public static String xml2Json(String responseXmlTemp) {
Document doc = null;
try {
doc = DocumentHelper.parseText(responseXmlTemp);
} catch (DocumentException e) {
logger.error("parse text error : " + e);
}
Element rootElement = doc.getRootElement();
Map<String,Object> mapXml = new HashMap<String,Object>();
element2Map(mapXml,rootElement);
String jsonXml = JSONObject.fromObject(mapXml).toString();
System.out.println("Json >>> " + jsonXml);
return jsonXml;
}
/**
* 將xml格式響應報文解析為Map格式
* @param responseXmlTemp
* @param thirdXmlServiceBean
* @return
* @throws DocumentException
*/
public static Map<String, Object> xml2map(String responseXmlTemp) {
Document doc = null;
try {
doc = DocumentHelper.parseText(responseXmlTemp);
} catch (DocumentException e) {
logger.error("parse text error : " + e);
}
Element rootElement = doc.getRootElement();
Map<String,Object> mapXml = new HashMap<String,Object>();
element2Map(mapXml,rootElement);
System.out.println("Map >>> " + mapXml);
return mapXml;
}
/**
* 使用遞歸調用將多層級xml轉為map
* @param map
* @param rootElement
*/
public static void element2Map(Map<String, Object> map, Element rootElement) {
//獲得當前節點的子節點
List<Element> elements = rootElement.elements();
if (elements.size() == 0) {
//沒有子節點說明當前節點是葉子節點,直接取值
map.put(rootElement.getName(),rootElement.getText());
}else if (elements.size() == 1) {
//只有一個子節點說明不用考慮list的情況,繼續遞歸
Map<String,Object> tempMap = new HashMap<String,Object>();
element2Map(tempMap,elements.get(0));
map.put(rootElement.getName(),tempMap);
}else {
//多個子節點的話就要考慮list的情況了,特別是當多個子節點有名稱相同的字段時
Map<String,Object> tempMap = new HashMap<String,Object>();
for (Element element : elements) {
tempMap.put(element.getName(),null);
}
Set<String> keySet = tempMap.keySet();
for (String string : keySet) {
Namespace namespace = elements.get(0).getNamespace();
List<Element> sameElements = rootElement.elements(new QName(string,namespace));
//如果同名的數目大於1則表示要構建list
if (sameElements.size() > 1) {
List<Map> list = new ArrayList<Map>();
for(Element element : sameElements){
Map<String,Object> sameTempMap = new HashMap<String,Object>();
element2Map(sameTempMap,element);
list.add(sameTempMap);
}
map.put(string,list);
}else {
//同名的數量不大於1直接遞歸
Map<String,Object> sameTempMap = new HashMap<String,Object>();
element2Map(sameTempMap,sameElements.get(0));
map.put(string,sameTempMap);
}
}
}
}
}