这是很久之前写的东西了。
在项目开发中数据传输的是难免会面临由不同的系统接收数据的情况,由于各个系统对数据格式的要求都不同;而我们的系统主要用到的是XML的解析,如果为了去解析客户平台发来的JSON数据而去改动原有的解析方式这样会很不方便。因为在前一个项目的时候这个工具类,发到这里算的一个纪念吧。
这里用的XML解析类库为dom4j,json的解析类库为json.jar:
import java.io.File;
import java.net.MalformedURLException;
import java.util.Iterator;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class XMLBuilder {
private static String documentChartset = "GBK";
/**
* 获取XML文档的编码格式
* @return
*/
public static String getDocumentChartset() {
return documentChartset;
}
/**
* 设置XML文档的编码格式
* @param documentChartset
*/
public static void setDocumentChartset(String documentChartset) {
XMLBuilder.documentChartset = documentChartset;
}
/**
* 将json对象转换为XML文档
* @param obj
* @param rootName
* @return
* @throws JSONException
*/
public static String traverseJSON(JSONObject obj,String rootName) throws JSONException
{
Document document = createDocument();
Element root = document.addElement(rootName);
traverseJSON(rootName,obj,root);
return document.asXML();
}
/**
* 将json数组转换为XML文档
* @param datas
* @param rootName
* @return
* @throws JSONException
*/
public static String traverseJSON(JSONArray datas,String rootName) throws JSONException
{
Document document = createDocument();
Element root = document.addElement(rootName);
traverseJSON(rootName,datas,root);
return document.asXML();
}
/**
* 转换中的主要工作类
* @param keyName
* @param data
* @param parentElement
* @throws JSONException
*/
private static void traverseJSON(String keyName,Object data,Element parentElement) throws JSONException
{
if(data instanceof JSONArray)
{
JSONArray datas = (JSONArray) data;
for(int i=0;i<datas.length();i++)
{
traverseJSON(keyName,datas.get(i),parentElement);
}
}
if(data instanceof JSONObject)
{
JSONObject datas = (JSONObject) data;
Iterator<String> ii = datas.sortedKeys();
while(ii.hasNext())
{
String key = ii.next();
Element newElement = parentElement.addElement(key);
System.out.println(key + " : " + newElement.asXML());
traverseJSON(key,datas.get(key),newElement);
}
}
if(!(data instanceof JSONObject) && !(data instanceof JSONArray))
{
parentElement.setText((String) data);
}
}
/**
* 根据已经设置好的rootName和keyName生成XML文档对象
* @param rootName 根目录名称
* @param keyName 二级目录的键名
* @param values 设置的多个值
* @return
*/
public static Document createDocument(String rootName,String keyName,String... values) {
Document document = createDocument();
Element root = document.addElement(keyName);
for(int i=0;i < values.length;i++)
{
root.addElement(keyName).setText(values[i]);
}
return document;
}
/**
* 将map集合转化成XML文档对象
* @param datas 数据集
* @param rootName 根节点名
* @return
*/
public static Document createDocument(Map<String,String> datas,String rootName) {
Document document = createDocument();
Element root = document.addElement(rootName);
for(String keyString : datas.keySet())
{
root.addElement(keyString).setText(datas.get(keyString));
}
return document;
}
/**
* 创建一个空的XML文档对象
* @return
*/
public static Document createDocument() {
Document document = DocumentHelper.createDocument();
document.setXMLEncoding(documentChartset);
return document;
}
/**
* 从文件读取XML,输入文件名,返回XML文档对象
* @param fileName文件名
* @return
* @throws MalformedURLException
* @throws DocumentException
*/
public static Document read(String fileName) throws MalformedURLException, DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File(fileName));
document.setXMLEncoding(documentChartset);
return document;
}
/**
* 返回Document文档对象对应的根节点
* @param doc
* @return
*/
public static Element getRootElement(Document doc){
return doc.getRootElement();
}
/**
* 以传入的element节点为起点以递归的方式遍历下属的所有节点
* @param element
*/
public void treeWalk(Element element)
{
for (int i = 0, size = element.nodeCount(); i < size; i++)
{
Node node = element.node(i);
if (node instanceof Element) {
treeWalk((Element) node);
}
else
{
// do something....
}
}
}
}