分享一个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("&", "&").replace(">", ">").replace("<", "<").replace("\"", """)
.replace("'", "'");
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());
}
}
网友评论