多层嵌套+复杂xml转Java实体类

时间:2024-10-22 08:04:27

首先我给出一个xml嵌套文件:

很多时候获取到的的xml文件是混乱无序的,需要自己花时间去区分整理,下方是我区分好的

(这里有一个小工具推荐给大家:在线 XML 格式化 | 菜鸟工具 ()

  1. <root>
  2. <country>
  3. <name>中国</name>
  4. <province>
  5. <name>广东省</name>
  6. <city>
  7. <name>广州市</name>
  8. <district>
  9. <name>天河区</name>
  10. <population>1357242</population>
  11. </district>
  12. <district>
  13. <name>越秀区</name>
  14. <population>1008543</population>
  15. </district>
  16. </city>
  17. <city>
  18. <name>深圳市</name>
  19. <district>
  20. <name>福田区</name>
  21. <population>1035837</population>
  22. </district>
  23. <district>
  24. <name>南山区</name>
  25. <population>1043563</population>
  26. </district>
  27. </city>
  28. </province>
  29. </country>
  30. </root>

打开idea,创建一个springboot项目,在pom文件中导入依赖:

  1. <dependency>
  2. <groupId></groupId>
  3. <artifactId>jaxb-api</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId></groupId>
  7. <artifactId>jaxb-core</artifactId>
  8. <version>2.3.0</version>
  9. </dependency>
  10. <dependency>
  11. <groupId></groupId>
  12. <artifactId>jaxb-impl</artifactId>
  13. <version>2.3.0</version>
  14. </dependency>
  15. <dependency>
  16. <groupId></groupId>
  17. <artifactId>jaxb-runtime</artifactId>
  18. <version>2.3.0</version>
  19. </dependency>
  20. <dependency>
  21. <groupId></groupId>
  22. <artifactId>activation</artifactId>
  23. <version>1.1.1</version>
  24. </dependency>

创建一个Java类,根据整理好的xml文件写第一层嵌套:

按照我提供的xml里面的内容,第一层是country,它下边的子元素分别为name和province

先了解以下重要注解:(按照我的格式写就好了,格式不用改)

@XmlRootElement:这是在JAXB中使用的Object必须有的注解,它定义了根元素
@XmlType:它将类映射到XML模式类型,我们可以用它来排列XML中的元素
@XmlTransient:这将确保Object属性不被写入XML中
@XmlAttribute: 这将创建Object属性作为一个属性
@XmlElement(name = “ABC”): 这将创建名称为 "ABC "的元素
@XmlElementWrapper: 注解表示生成一个包装器元素(一般用于集合元素)

  1. import ;
  2. import ;
  3. import ;
  4. import ;
  5. import .annotation.*;
  6. import ;
  7. @XmlAccessorType()
  8. @XmlRootElement(name = "country")//根元素名
  9. @XmlType(propOrder = {"name","province"})//子元素的排序,多个用逗号隔开
  10. @Data
  11. @AllArgsConstructor
  12. @NoArgsConstructor
  13. @Builder
  14. /**
  15. * @Author:changsail
  16. * @Data:2023/10/18
  17. */
  18. public class country {
  19. @XmlElement(name ="name")
  20. private String name ;
  21. @XmlElement(name ="province")
  22. private province province ;
  23. }

 (由于这一层嵌套里面name没有下级嵌套,只有字符,所以用String修饰,而province有下级嵌套,所以用Province修饰)

注意:由于province下级有多个city并列,所以需要用到List列表,如下:

  1. import ;
  2. import ;
  3. import ;
  4. import ;
  5. import .annotation.*;
  6. import ;
  7. @XmlAccessorType()
  8. @XmlRootElement(name = "province")//根元素名
  9. @XmlType(propOrder = {"name","city"})//子元素的排序,多个用逗号隔开
  10. @Data
  11. @AllArgsConstructor
  12. @NoArgsConstructor
  13. @Builder
  14. /**
  15. * @Author:changsail
  16. * @Data:2023/10/18
  17. */
  18. public class province {
  19. @XmlElement(name ="name")
  20. private String name;
  21. @XmlElement(name ="city",type=)
  22. private List<city> city;
  23. }

(这里city用List<city>修饰保证所有city都可被转,不会发生遗漏)

最后我们封装一个工具类,用来实现xml到Java的转换:

网上有很多封装好的,找到直接cv就好了,也可以复制我的......

  1. import ;
  2. import ;
  3. import ;
  4. import ;
  5. import ;
  6. import ;
  7. /**
  8. * 转换Xml工具类
  9. * @Author: changsail
  10. * @Date: 2023/10/18
  11. */
  12. public class ConvertXmlUtil {
  13. /**
  14. * 字符串xml转换成Java对象
  15. * @param mapObject xml映射实体
  16. * @param xmlStr xml字符串
  17. * @return: java对象
  18. */
  19. @SuppressWarnings("unchecked")
  20. public static Object convertXmlStrToObject(Class mapObject, String xmlStr) {
  21. Object javaObject = null;
  22. try {
  23. JAXBContext context = (mapObject);
  24. Unmarshaller unmarshaller = ();
  25. StringReader sr = new StringReader(xmlStr);
  26. javaObject = (sr);
  27. } catch (JAXBException e) {
  28. ();
  29. }
  30. return javaObject;
  31. }
  32. /**
  33. * 将file类型的xml转换成Java对象
  34. * @param mapObject xml映射实体
  35. * @param xmlPath xml文件路径
  36. * @return java对象
  37. */
  38. @SuppressWarnings("unchecked")
  39. public static Object convertXmlFileToObject(Class mapObject, String xmlPath) {
  40. Object javaObject = null;
  41. try {
  42. JAXBContext context = (mapObject);
  43. Unmarshaller unmarshaller = ();
  44. FileReader fr = null;
  45. try {
  46. fr = new FileReader(xmlPath);
  47. } catch (FileNotFoundException e) {
  48. ();
  49. }
  50. javaObject = (fr);
  51. } catch (JAXBException e) {
  52. ();
  53. }
  54. return javaObject;
  55. }
  56. }

完成以上所有步骤,我们就可以创建Test测试类来调方法进行转换了!

  1. import ;
  2. import .*;
  3. public class Test {
  4. public static void main(String[] args) throws IOException {
  5. String fileName = "C:\\Users\\Administrator\\Desktop\\示例"; //xml文件地址
  6. String encoding = "utf-8"; //保证转换后的结果不会乱码
  7. File file = new File(fileName);
  8. Long fileLength = file.length();
  9. byte[] fileContent = new byte[()];
  10. FileInputStream in = null;
  11. String newFile = null;
  12. try {
  13. in = new FileInputStream(file);
  14. in.read(fileContent);
  15. newFile = new String(fileContent, encoding);
  16. } catch (IOException e) {
  17. ();
  18. }
  19. int begin = ("<country>");
  20. int end = ("</country>");
  21. String contentFile = (begin, end + "</country>".length());
  22. contentFile =("[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]", "");
  23. contentFile =("<!\\[CDATA\\[", "");
  24. contentFile =("]]", "");
  25. contentFile =(">>", "");
  26. root= () (.class,contentFile);
  27. // HIPMessageServerResult hipMessageServerResult= (HIPMessageServerResult) (contentFile,HIPMessageServerResult.class);
  28. ((root));
  29. }
  30. public static String xmlToJava(){
  31. String fileName = "C:\\Users\\Administrator\\Desktop\\示例";
  32. String encoding = "utf-8";
  33. File file = new File(fileName);
  34. Long fileLength = file.length();
  35. byte[] fileContent = new byte[()];
  36. FileInputStream in = null;
  37. String newFile = null;
  38. try {
  39. in = new FileInputStream(file);
  40. in.read(fileContent);
  41. newFile = new String(fileContent, encoding);
  42. } catch (IOException e) {
  43. ();
  44. }
  45. int begin = ("<country>");
  46. int end = ("</country>");
  47. String contentFile = (begin, end + "</country>".length());
  48. contentFile =("[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]", "");
  49. contentFile =("<!\\[CDATA\\[", "");
  50. contentFile =("]]", "");
  51. contentFile =(">>", "");
  52. root= () (country.class,contentFile);
  53. // HIPMessageServerResult hipMessageServerResult= (HIPMessageServerResult) (contentFile,HIPMessageServerResult.class);
  54. return ((root));
  55. }
  56. }

运行Test,返回结果:

然后大功告成!