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;
}
}
相关阅读
一、定义<context-param> <param-name>参数名</param-name> <param-value>参数值</param-value> </context-param>作用:
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对于上面三个选择下载哪个的判断可以参
一般情况下,大多数软件公司做开发的时候都不用myeclipse开发,这是利用ant部署就给我们带来极大的方便,它先将你的project打包成war包
Ant的概念Make命令是一个项目管理工具,而Ant所实现功能与此类似。像make,gnumake和nmake这些编译工具都有一定的缺陷,但是Ant