美文网首页
xml 工具类

xml 工具类

作者: _Rondo | 来源:发表于2020-08-07 09:52 被阅读0次

    分享一个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());
        }
    
    
    }
    
    

    相关文章

      网友评论

          本文标题:xml 工具类

          本文链接:https://www.haomeiwen.com/subject/ptzxdktx.html