XMLFormat.java 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package com.ydtech.utils;
  2. /**
  3. * @author gws
  4. * @description:TODO
  5. * @date 2022-07-15 17:36
  6. */
  7. public class XMLFormat {
  8. //格式化XML字符串
  9. public static String format(String originStr) {
  10. String XMLInfo = null;
  11. StringBuilder sb = new StringBuilder();
  12. try {
  13. if (originStr != null) {
  14. if (originStr.trim().startsWith("<?")) {
  15. //包含XML版本编码
  16. XMLInfo = originStr.trim().substring(0, originStr.trim().indexOf("?>") + 2);
  17. originStr = originStr.trim().substring(originStr.trim().indexOf("?>") + 2, originStr.trim().length());
  18. }
  19. char[] charArray = originStr.toCharArray();
  20. int openCount = 0;
  21. int closeCount = 0;
  22. int lastNode = -1;//0 <> 1 </>
  23. for (int i = 0; i < charArray.length; i++) {
  24. // < open and 换行
  25. if (charArray[i] == '<' && i != charArray.length - 1 && charArray[i + 1] != '/' && charArray[i + 1] != '!') {
  26. lastNode = 0;
  27. enterAndTabs(sb, openCount - closeCount);
  28. sb.append(charArray[i]);
  29. openCount++;
  30. continue;
  31. }
  32. // </ close and 换行
  33. if (charArray[i] == '<' && i != charArray.length - 1 && charArray[i + 1] == '/') {
  34. // 0 表示 开-闭 ,不换行
  35. if (lastNode != 0) {
  36. enterAndTabs(sb, openCount - closeCount - 1);
  37. }
  38. sb.append(charArray[i]).append(charArray[++i]);
  39. closeCount++;
  40. lastNode = 1;
  41. continue;
  42. }
  43. // 自闭合
  44. if (charArray[i] == '>' && i > 0 && charArray[i - 1] == '/') {
  45. sb.append(charArray[i]);
  46. closeCount++;
  47. continue;
  48. }
  49. //反着来了
  50. sb.append(charArray[i]);
  51. }
  52. }
  53. } catch (Exception exception) {
  54. }
  55. sb.insert(0, XMLInfo);
  56. return sb.toString();
  57. }
  58. /**
  59. * 回车与制表符
  60. *
  61. * @param sb StringBuilder
  62. * @param tabCount 多少个制表符
  63. */
  64. private static void enterAndTabs(StringBuilder sb, int tabCount) {
  65. sb.append("\n");
  66. while (tabCount-- > 0) {
  67. sb.append(" ");
  68. }
  69. }
  70. public static void main(String[] args) {
  71. String xmlString_sign = "<RequestData><requestHead><seqNo>1d6ff938-ada5-4f39-9fc1-e</seqNo><consumerID>102120</consumerID><consumerAccessKey>123456test</consumerAccessKey> <transCode>C1</transCode><transTime>2022-07-12 18:00:00</transTime></requestHead><requestBody><cityCode>140400</cityCode><cityName>长治市</cityName><frameNo>LVVDA11B7AD256799</frameNo><licenseNo>晋DW0717</licenseNo><engineNo>NAAG02917</engineNo><enrollDate>2010-08-23</enrollDate><modelName>奇瑞SQR7150A130轿车</modelName><modelCode/><newVehicle/><extendInfo/></requestBody></RequestData>";
  72. System.out.println(111);
  73. System.out.println(format(xmlString_sign));
  74. }
  75. }