必威体育Betway必威体育官网
当前位置:首页 > IT技术

xml字符串格式化

时间:2019-08-09 09:42:12来源:IT技术作者:seo实验室小编阅读:80次「手机版」
 

xml格式化

说明

1、调用方法 : new XMlformat(xml).format();

2、该类不引用其他第三方jar包.

3、支持对缩写< />进行格式化

本文参考博文:https://blog.csdn.net/Dior_DNA/article/details/77966895

代码


import org.apache.commons.lang3.StringUtils;

/**
 * @ClassName: XMLFormat
 * @Description:xml字符串格式化
 * @Date:2019/1/14 10:53
 **/
public class XMLFormat {

    /** xml字符串 */
    private static  String xmlStr;
    /** 缩进字符串 */
    private static final String RETRACT_SPACE = "    ";

    public XMLFormat(String xmlStr) {
        this.xmlStr = xmlStr;
    }

    /**
     * 格式化xml
     * 调用:new XMLFormat(xml).format();
     * */
    public static String format() throws Exception{
        String header = getHeader();
        return (StringUtils.isempty(header) ? "" : header)
                + format(null, returnAcronyn(xmlStr), 0);
    }

    /***
     * @param tag 标签
     * @param xmlStr 美化前的xml字符串
     * @param depth 报文深度,初始值为0
     * @return
     * @throws Exception
     */
    private static String format(String tag, String xmlStr, int depth) throws Exception{
        String format = "";
        String firstTag = "";
        /** 获取xml报文的第一个标签 */
        if (StringUtils.isEmpty(tag))  firstTag = getFirstTag(xmlStr);
        else firstTag = tag;
        /** 获取该标签下的value值 */
        String inside = getInsidecontent(firstTag, xmlStr);
        /** 获取该标签外的报文 */
        String outside = getOutsideContent(firstTag, xmlStr);
        String insideTag = "";
        try {
            insideTag = getFirstTag(inside);
        } catch (Exception e) {
            insideTag = null;
        }
        if (StringUtils.isEmpty(insideTag)) {
            format = "\r\n" + indent(depth) + "<" + firstTag + ">"
                    + inside + "</" + firstTag.split(" ")[0] + ">";
        } else {
            format = "\r\n" + indent(depth) + "<" + firstTag + ">"
                    + format(insideTag, inside, depth + 1)
                    + indent(depth) + "</" + firstTag.split(" ")[0] + ">";
        }
        String outsideTag = "";
        if (StringUtils.isEmpty(outside)) outsideTag = null;
         else  outsideTag = getFirstTag(outside);
        if (!StringUtils.isEmpty(outsideTag))
            format += indent(depth) + format(outsideTag, outside, depth);
        else if (StringUtils.isEmpty(outside))  format += "\r\n";
        else throw new Exception("xml报文格式不正确");
        return format;
    }

    /**
     * 获取xml头部数据,格式以 "<?" 开头,以 "?>" 结尾
     * 例:<?xml version="1.0" encoding="UTF-8"?>
     * 返回 :xml头部数据,不存在则返回null
     */
    private static String getHeader() throws Exception{
        for (int i = 0; i < xmlStr.length(); i++) {
            char c = xmlStr.charAt(i);
            if (c == ' ' || c == '\r' || c == '\n'
                    || c == '\t') continue;
            if (c == '<' && xmlStr.charAt(i + 1) == '?') {
                String header = "<?";
                for (i = i + 2; i < xmlStr.length(); i++) {
                    char end = xmlStr.charAt(i);
                    if (end == '?' && xmlStr.charAt(i + 1) == '>') {
                        header += "?>";
                        xmlStr = xmlStr.substring(i + 2);
                        return header;
                    } else {
                        header += end;
                    }
                }
            }
            return null;
        }
        return null;
    }

    /**
     * 获取xml报文的第一个标签
     * @param xmlStr xml报文
     * @return 标签名称
     */
    private static String getFirstTag(String xmlStr) throws Exception{
        stringbuilder tag = new StringBuilder();
        int index = 0;
        for (; index < xmlStr.length(); index++) {
            char temp = xmlStr.charAt(index);
            if (temp == ' ' || temp == '\r' || temp == '\n'
                    || temp == '\t') { //忽略空格回车字符
                continue;
            }
            if (temp != '<')  throw new Exception("xml报文格式不正确");
            break;
        }
        for (int i = index + 1; i < xmlStr.length(); i++) {
            char c = xmlStr.charAt(i);
            if (c == '>')  return tag.toString();
            tag.APPend(c);
        }
        throw new Exception("xml报文格式不正确");
    }

    /**
     * 获取当前标签需要的空格字符串
     * @param num 报文深度
     * @throws Exception
     */
    private static String indent(int num) throws Exception{
        String space = "";
        if (num == 0) return space;
        else  return space + RETRACT_SPACE + indent(num - 1);
    }

    /**
     * 获取该标签外的报文
     * @param tag 标签
     * @param xmlStr  xml字符串
     */
    private static String getOutsideContent(String tag, String xmlStr) throws Exception{
        String endTag = "</" + tag.split(" ")[0] + ">";
        int endIndex = xmlStr.indexof(endTag) + endTag.length();
        return xmlStr.substring(endIndex);
    }

    /**
     * 获取该标签下的value值
     * @param tag 标签
     * @param xmlStr xml字符串
     */
    private static String getInsideContent(String tag, String xmlStr) {
        String startTag = "<" + tag + ">";
        String endTag = "</" + tag.split(" ")[0] + ">";
        int startIndex = xmlStr.indexOf(startTag) + startTag.length();
        int endIndex = xmlStr.indexOf(endTag);
        return xmlStr.substring(startIndex, endIndex);
    }
    
    /**
     * 替换缩写
     * 由<XXX/> 转换为<XXX></XXX>
     */
	private static String returnAcronyn (String xml) {
	  String result =null;
	  if (xml.contains("/>")) {
	    // 截取第一个"/>" 前的数据
	    String head = xml.substring(0,xml.indexOf("/>"));
	    // 拿到缩写的数据,并去空格。
	    String key = head.substring(head.lastIndexOf("<")+1);
	    key = key.replaceAll("\\s", "");
	    // 截取第一个"/>" 后的数据
	    String behind = xml.substring(xml.indexOf("/>")+2); \
	    // 拼接字符串
	    result = head.substring(0, head.lastIndexOf("<"));
	    result = result + "<" + key + "></" + key + ">" + behind;
	  } else {
	     result = xml;
	  }
	  if  (result.contains("/>"))  
	     result = returnAcronyn(result);
	  return result;
	}

}






相关阅读

web.xml中context-param的配置作用

一、定义<context-param>  <param-name>参数名</param-name>  <param-value>参数值</param-value>  </context-param>作用:

Java解析XML文件的四种方式

java读取xml文件的四种方法Xml代码 1 <?xml version="1.0" encoding="GB2312"?> 2 <RESULT> 3 <VALUE>   4 <NO>A1

安装Microsoft Office 2010 提示需要安装MSXML版本6.1

MSXML6.0下载: 打开连接:https://www.microsoft.com/zh-cn/download/details.aspx?id=6276对于上面三个选择下载哪个的判断可以参

build.xml是什么

一般情况下,大多数软件公司做开发的时候都不用myeclipse开发,这是利用ant部署就给我们带来极大的方便,它先将你的project打包成war包

Ant_的最完整build.xml解释

Ant的概念Make命令是一个项目管理工具,而Ant所实现功能与此类&#20284;。像make,gnumake和nmake这些编译工具都有一定的缺陷,但是Ant

分享到:

栏目导航

推荐阅读

热门阅读