fashjson与xml的转换dom4j

fashjson与xml的转换dom4j

从网上找了一些现成的,但是都是东拼西凑的,用起来不理想。这边自己处理了一下,写完了自己都不想再去看一眼,感觉写的有些乱,记录一下吧,以后再用到了可以直接复制。

说明一下
xml转成json时,属性值以@号开头作为json的key
json转成xml时,同样根据@号开头的key作为属性值处理

    <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6.1</version>
    </dependency>
package iotthing.airciotsystem.bisframework.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.dom4j.*;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;

@Slf4j
public class JsonXmlUtils {

	/**
	 * 解决 CDATA 问题
	 */
	private static Pattern pattern = Pattern.compile("[<>&\"',]");
	private static String escape(String string) {
		return pattern.matcher(string).find() ? "<![CDATA[" + string + "]]>" : string;
	}

	public static boolean isEmpty(String str) {

		if (str == null || str.trim().isEmpty() || "null".equals(str)) {
			return true;
		}
		return false;
	}

	/**
	 * updateXml 处理xml头,以及根标签
	 */
	private static String updateXml(String xmlStr) {
		xmlStr = xmlStr.trim();
		if (StringUtils.isBlank(xmlStr)) {
			return xmlStr;
		}

		// 过滤非法字符
		xmlStr = xmlStr.replaceAll("[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]", "");

		StringBuilder xmlSb = new StringBuilder(xmlStr);
		if (!xmlStr.startsWith("<?")) {
			xmlSb.insert(0, "<?xml version=\"1.0\" encoding=\"utf-8\"?>");
		}

		int idx = xmlSb.indexOf("?>") + 2;
		xmlSb.insert(idx, "<root_chinadaas>").append("</root_chinadaas>");
		System.out.println(xmlSb.toString());
		return xmlSb.toString();
	}


	/**
	 * xml转json的核心循环方法
	 *
	 * @param element
	 * @param json
	 */
	private static void dom4j2Json(Element element, JSONObject json) {
		// 如果是属性
		for (Object o : element.attributes()) {
			Attribute attr = (Attribute) o;
			if (!isEmpty(attr.getValue())) {
				json.put("@" + attr.getName(), attr.getValue());
			}
		}
		List<Element> chdEl = element.elements();
		if (chdEl.isEmpty() && !isEmpty(element.getText())) { // 如果没有子元素,只有一个值
			json.put(element.getName(), element.getText());
		}

		for (Element e : chdEl) { // 有子元素
			if (!e.elements().isEmpty() || e.attributes().size() > 0) { // 子元素也有子元素,
				JSONObject chdjson = new JSONObject();
				dom4j2Json(e, chdjson);
				Object o = json.get(e.getName());
				if (o != null) {
					JSONArray jsona = null;
					if (o instanceof JSONObject) { // 如果此元素已存在,则转为jsonArray
						JSONObject jsono = (JSONObject) o;
						json.remove(e.getName());
						jsona = new JSONArray();
						jsona.add(jsono);
						jsona.add(chdjson);
					}
					if (o instanceof JSONArray) {
						jsona = (JSONArray) o;
						jsona.add(chdjson);
					}
					json.put(e.getName(), jsona);
				} else {
					if (!chdjson.isEmpty()) {
						json.put(e.getName(), chdjson);
					}
				}
			} else { // 子元素没有子元素
				for (Object o : element.attributes()) {
					Attribute attr = (Attribute) o;
					if (!isEmpty(attr.getValue())) {
						json.put("@" + attr.getName(), attr.getValue());
					}
				}
				if (!e.getText().isEmpty()) {
					json.put(e.getName(), e.getText());
				}
			}
		}
	}

	/**
	 * xml转Json调用
	 * @throws DocumentException
	 */
	public static JSONObject xml2Json(String xmlStr) throws DocumentException {
		xmlStr = updateXml(xmlStr);
		Document doc = DocumentHelper.parseText(xmlStr);
		JSONObject json = new JSONObject();
		dom4j2Json(doc.getRootElement(), json);
		return json;
	}


	/**
	 * 根据at号获取所有的属性list
	 */
	public static JSONObject getAttribute(JSONObject jdata) {
		JSONObject rdata = new JSONObject();
		try {
			Set<Map.Entry<String, Object>> setdata = jdata.entrySet();
			for (Iterator<Map.Entry<String, Object>> it = setdata.iterator(); it.hasNext();) {
				Map.Entry<String, Object> en = it.next();
				if(en.getKey().startsWith("@")){
					rdata.put(en.getKey().substring(1),escape((String) en.getValue()));
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return rdata;
	}

	/**
	 * Json to xmlstr 核心循环方法
	 */
	public static String json2Xmlstr(JSONObject jObj, StringBuffer buffer) {
		Set<Map.Entry<String, Object>> se = jObj.entrySet();
		for (Iterator<Map.Entry<String, Object>> it = se.iterator(); it.hasNext();) {
			Map.Entry<String, Object> en = it.next();
			if (en.getValue().getClass().getName().equals("com.alibaba.fastjson.JSONObject")) {
				JSONObject jo = jObj.getJSONObject(en.getKey());
				buffer.append("<" + en.getKey());

				//处理xml标签的属性值
				JSONObject attrlist = getAttribute(jo);
				Set<Map.Entry<String, Object>> attr = attrlist.entrySet();
				for (Iterator<Map.Entry<String, Object>> mt = attr.iterator(); mt.hasNext();) {
					Map.Entry<String, Object> amap = mt.next();
					buffer.append(" " + amap.getKey() + "=\""+escape((String) amap.getValue()) + "\"");
				}
				buffer.append(">");
				if(jo.containsKey(en.getKey())){
					//标签直接有值的话,直接赋值
					buffer.append(jo.getString(en.getKey()));
				}else{
					json2Xmlstr(jo, buffer);
				}
				buffer.append("</" + en.getKey() + ">");
			} else if (en.getValue().getClass().getName().equals("com.alibaba.fastjson.JSONArray")) {
				JSONArray jarray = jObj.getJSONArray(en.getKey());
				for (int i = 0; i < jarray.size(); i++) {
					buffer.append("<" + en.getKey());
					JSONObject jsonobject = jarray.getJSONObject(i);

					//处理xml标签的属性值
					JSONObject attrlist = getAttribute(jsonobject);
					Set<Map.Entry<String, Object>> attr = attrlist.entrySet();
					for (Iterator<Map.Entry<String, Object>> mt = attr.iterator(); mt.hasNext();) {
						Map.Entry<String, Object> amap = mt.next();
						buffer.append(" " + amap.getKey() + "=\""+escape((String) amap.getValue()) + "\"");
					}
					buffer.append(">");

					json2Xmlstr(jsonobject, buffer);
					buffer.append("</" + en.getKey() + ">");
				}
			} else if (en.getValue().getClass().getName().equals("java.lang.String")) {
				if(!en.getKey().startsWith("@")){//@号的是属性,在前面已经处理过,这里就不处理了
					buffer.append("<" + en.getKey() + ">" + escape((String) en.getValue()));
					buffer.append("</" + en.getKey() + ">");
				}
			}
		}
		return buffer.toString();
	}

	/**
	 * json转xml调用
	 *
	 * @param json
	 * @return java.lang.String
	 */
	public static String json2Xml(String json) {
		try {
			StringBuffer buffer = new StringBuffer();
			buffer.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
			JSONObject jObj = JSON.parseObject(json);
			json2Xmlstr(jObj, buffer);
			return buffer.toString();
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}


	public static void main(String[] args) throws DocumentException {
		String xmlStr = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" +
				"<root>\n" +
				"    <common>\n" +
				"        <type>report</type>\n" +
				"    </common>\n" +
				"    <data operation=\"report\">\n" +
				"        <sequence>1</sequence>\n" +
				"        <parser>yes</parser>\n" +
				"        <time>20151130111544</time>\n" +
				"        <total>0</total>\n" +
				"        <current>0</current>\n" +
				"        <meter id=\"450100A0120001\" address=\"112233445566\">\n" +
				"            <function id=\"01\" error=\"00\" coding=\"01A10\">1.1</function>\n" +
				"        </meter>\n" +
				"        <meter id=\"450100A0120002\" address=\"112233445566\">\n" +
				"            <function id=\"01\" error=\"00\" coding=\"01A20\">22.2</function>\n" +
				"        </meter>\n" +
				"    </data>\n" +
				"</root>";
		JSONObject xml2Map = xml2Json(xmlStr);
		System.out.println(xml2Map);
		System.out.println("==============================");
		xmlStr = json2Xml(xml2Map.toString());
		System.out.println(xmlStr);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值