xml 工具类

2020-08-07  本文已影响0人  _Rondo

分享一个xml 工具类,因为最近在做socket报文解析,因为xml中有回车啊空格之类的不能直接转json需要格式化

import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.alibaba.fastjson.JSONArray;
import lombok.extern.slf4j.Slf4j;
import org.dom4j.*;

import com.alibaba.fastjson.JSONObject;

import static java.util.regex.Pattern.compile;

/**
 * xml工具
 *
 * @author wenx
 * @date 2020-07-29
 */
@Slf4j
public class XmlUtil {


    /**
     * String 转 org.dom4j.Document
     *
     * @param xml
     * @return
     * @throws DocumentException
     */
    public static Document strToDocument(String xml) {
        try {
            //加上xml标签是为了获取最外层的标签,如果不需要可以去掉
            return DocumentHelper.parseText("<xml>" + xml + "</xml>");
        } catch (DocumentException e) {
            return null;
        }
    }

    /**
     * org.dom4j.Document 转  com.alibaba.fastjson.JSONObject
     *
     * @param xml
     * @return
     * @throws DocumentException
     */
    public static JSONObject documentToJSONObject(String xml) {
        Document document = strToDocument(formatXml(xml));
        return elementToJSONObject(document.getRootElement());
    }

    /**
     * 格式化xml字符串
     * @param xml
     * @return
     */
    public static String formatXml(String xml) {
        xml = filterMacBlock(xml).replace(" ","");
        Document document = strToDocument(xml);
        return document.getRootElement().getTextTrim();
    }

    /**
     * org.dom4j.Element 转  com.alibaba.fastjson.JSONObject
     *
     * @param node
     * @return
     */
    public static JSONObject elementToJSONObject(Element node) {
        JSONObject result = new JSONObject();
        // 当前节点的名称、文本内容和属性
        // 当前节点的所有属性的list
        List<Attribute> listAttr = node.attributes();
        // 遍历当前节点的所有属性
        for (Attribute attr : listAttr) {
            result.put(attr.getName(), attr.getValue());
        }
        // 递归遍历当前节点所有的子节点
        // 所有一级子节点的list
        List<Element> listElement = node.elements();
        if (!listElement.isEmpty()) {
            // 遍历所有一级子节点
            for (Element e : listElement) {
                // 判断一级节点是否有属性和子节点
                if (e.attributes().isEmpty() && e.elements().isEmpty())
                    // 沒有则将当前节点作为上级节点的属性对待
                    result.put(e.getName(), e.getTextTrim());
                else {
                    // 判断父节点是否存在该一级节点名称的属性
                    if (!result.containsKey(e.getName())) {
                        // 没有则创建
                        result.put(e.getName(), new JSONArray());
                    }
                    // 将该一级节点放入该节点名称的属性对应的值中
                    ((JSONArray) result.get(e.getName())).add(elementToJSONObject(e));
                }
            }
        }
        return result;
    }


    private static String filterMacBlock(String value) {
        if (value==null||value.length()==0) {
            return value;
        }
        Pattern pattern = compile("[\\x20-\\x7E]");
        Matcher matcher = pattern.matcher(value);
        String newValue = "";
        while (matcher.find()) {
            String s = matcher.group();
            newValue += s;
        }

        newValue = newValue.replace("&", "&amp;").replace(">", "&gt;").replace("<", "&lt;").replace("\"", "&quot;")
                .replace("'", "&apos;");

        byte[] a = newValue.getBytes(StandardCharsets.UTF_8);
        return new String(a);
    }

    public static void main(String[] args) {
        String resp = "<Service>\n" +
                "  <Service_Header>\n" +
                "    <end_timestamp>2020-07-30 11:55:04.795</end_timestamp>\n" +
                "  </Service_Header>\n" +
                "  <Service_Body>\n" +
                "    <request>\n" +
                "    </request>\n" +
                "    <response>\n" +
                "    </response>\n" +
                "  </Service_Body>\n" +
                "</Service>";
        JSONObject jsonObject = XmlUtil.documentToJSONObject(resp);
        System.out.println(jsonObject.toJSONString());
    }


}

上一篇下一篇

猜你喜欢

热点阅读