格式转换,XMLtoJSON
最近项目里,要实现一个由XML文件获取信息,最终转换为JSON字符串的功能,自己实现了一个XML2JSON的工具类,供大家分享:
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.json.JSONObject;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
/**
* @author chenhan
* @Descriptions XML文件解析,返回对应的Json
* @date 14-7-9 上午11:54
*/
public class Xml2JsonUtil {
/**
* 转换一个xml格式的字符串到json格式
* @return 成功返回json 格式的字符串;失败反回null
*/
public static JSONObject xml2JSON() {
JSONObject json = new JSONObject();
try {
//把要解析的XML文档转化为输入流,以便SAX解析器解析它
InputStream is = <span style="font-family: Arial, Helvetica, sans-serif;">Xml2JsonUtil</span><span style="font-family: Arial, Helvetica, sans-serif;">.class.getClassLoader().getResourceAsStream("chartConfig.xml");</span>
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(is);
//得到XML文档的根节点
Element root = doc.getRootElement();
//给json对象填充迭代好的数据
json.put(root.getName(), iterateElement(root));
return json;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 一个迭代方法
* @param element
* @return java.util.Map 实例
*/
private static Map iterateElement(Element element) {
//获得当前节点的所有子节点
List node = element.getChildren();
Element et = null;
Map nodeMap = new HashMap();
//List用于存node的迭代标签
List list = null;
for (int i = 0; i < node.size(); i++) {
list = new LinkedList();
et = (Element) node.get(i);
//标签值为空
if (et.getTextTrim().equals("")) {
//System.out.println(et.getTextTrim());
//非嵌套标签
if (et.getChildren().size() == 0){
if (nodeMap.containsKey(et.getName())) {
list = (List) nodeMap.get(et.getName());
}
list.add(et.getText());
//nodeMap.put(et.getName(), list); 注销是因为此时如果传入list则会出现非嵌套的赋值错误
nodeMap.put(et.getName(),et.getText());
}
//嵌套标签
else{
if (nodeMap.containsKey(et.getName())) {
list = (List) nodeMap.get(et.getName());
}
list.add(iterateElement(et));
//嵌套的标签,则需要传入list
nodeMap.put(et.getName(), list);
}
} else {
if (nodeMap.containsKey(et.getName())) {
list = (List) nodeMap.get(et.getName());
}
list.add(et.getText());
//nodeMap.put(et.getName(), list);
nodeMap.put(et.getName(),et.getText());
}
}
return nodeMap;
}
// 测试
public static void main(String[] args) {
System.out.println(Xml2JsonUtil.xml2JSON());
}
}
其中
"chartConfig.xml"为需要解析的文件,大家可以自定义,
需要说明的是,需要引入jdom.jar 以及json.jar ,
值得一提的是,文中关于list的注释及修改,是对输出格式不正确的修改。