XmlUtils.java 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package com.kmall.admin.haikong.utils;
  2. import com.kmall.admin.haikong.dto.WareQueryStockResponseDTO;
  3. import javax.xml.bind.JAXBContext;
  4. import javax.xml.bind.Marshaller;
  5. import javax.xml.bind.Unmarshaller;
  6. import java.io.Reader;
  7. import java.io.StringReader;
  8. import java.io.StringWriter;
  9. import java.util.Objects;
  10. /**
  11. * @author lhm
  12. * @createDate 2021-11-12
  13. */
  14. public class XmlUtils {
  15. /**
  16. * 对象转xml文本
  17. * @param obj 对象
  18. * @param format 是否格式化
  19. * @return xml文本
  20. */
  21. public static String toXml(Object obj, boolean format) throws Exception {
  22. try {
  23. JAXBContext context = JAXBContext.newInstance(obj.getClass());
  24. Marshaller marshaller = context.createMarshaller();
  25. //编码格式
  26. marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
  27. marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.FALSE);
  28. // 是否格式化生成的xml串
  29. if (format) {
  30. marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
  31. } else {
  32. marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.FALSE);
  33. }
  34. // 是否省略xm头声明信息
  35. marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
  36. StringWriter writer = new StringWriter();
  37. writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
  38. marshaller.marshal(obj, writer);
  39. return writer.toString();
  40. } catch (Exception e) {
  41. throw new RuntimeException(e);
  42. }
  43. }
  44. /**
  45. * xml 转对象
  46. *
  47. * @param xml
  48. * @param c
  49. * @return
  50. */
  51. public static <T> Object toObject(String xml, Class<T> c) throws Exception {
  52. Reader reader = null;
  53. try {
  54. JAXBContext context = JAXBContext.newInstance(c);
  55. // XML 转为对象的接口
  56. Unmarshaller unmarshaller = context.createUnmarshaller();
  57. reader = new StringReader(xml);
  58. return unmarshaller.unmarshal(reader);
  59. } catch (Exception e) {
  60. throw new RuntimeException(e);
  61. } finally {
  62. if (Objects.nonNull(reader)) {
  63. reader.close();
  64. }
  65. }
  66. }
  67. public static void main(String[] args) throws Exception {
  68. String response = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
  69. "<response>\n" +
  70. " <flag>success|failure</flag>\n" +
  71. " <code>响应码</code>\n" +
  72. " <message>响应信息</message>\n" +
  73. " <items>\n" +
  74. " <item>\n" +
  75. " <warehouseCode>仓库编码, string (50)</warehouseCode>\n" +
  76. " <itemCode>商品编码, string (50) , 必填</itemCode>\n" +
  77. " <itemId>仓储系统商品ID, string (50),条件必填</itemId>\n" +
  78. " <inventoryType>库存类型,string (50) , ZP=正品, CC=残次,JS=机损, XS= 箱损, ZT=在途库存</inventoryType>\n" +
  79. " <imperfectGrade>残品等级,string (50) ,AG=一级残,BG=二级残,CG=三级残 ,退货仓使用</imperfectGrade>\n" +
  80. " <quantity>1</quantity>\n" +
  81. " <lockQuantity>1</lockQuantity>\n" +
  82. " <batchCode>批次编码, string (50)</batchCode>\n" +
  83. " <productDate>商品生产日期 YYYY-MM-DD,条件必填</productDate>\n" +
  84. " <expireDate>商品过期日期YYYY-MM-DD,条件必填</expireDate>\n" +
  85. " <produceCode>生产批号, string (50)</produceCode>\n" +
  86. " <extendProps>扩展属性 \n" +
  87. " \n" +
  88. " <key1>value1</key1>\n" +
  89. " <key2>value2</key2>\n" +
  90. " </extendProps>\n" +
  91. " </item>\n" +
  92. " </items>\n" +
  93. "</response>";
  94. WareQueryStockResponseDTO o = (WareQueryStockResponseDTO) toObject(response, WareQueryStockResponseDTO.class);
  95. System.out.println(o);
  96. }
  97. }