java解析XML映射成对象实体
时间:2021-07-13 17:47:44
收藏:0
阅读:0
使用JDK自带的
1.创建一个XML文件:config.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <root > 3 4 <section target="system_user" description="用户信息" relation="" sourceIdentityColumn="id" targetIdentityColumn="source_id" isEnabled="true"> 5 <table source="system_sync_pre_school_student" description="幼儿园学生信息" condition="" isEnabled="true"> 6 <column source="id" target="source_id" type="STRING" description="源数据与目标数据的对应值" filter="" replace="" isEnabled="true"/> 7 <column source="name" target="name" type="STRING" description="姓名" filter="" replace="" isEnabled="true"/> 8 <column source="sex" target="sex" type="STRING" description="性别" filter="" replace="男=1,女=0" isEnabled="true"/> 9 <column source="student_id" target="open_id" type="STRING" description="用户唯一openId" filter="" replace="" isEnabled="true"/> 10 11 </table> 12 </section> 13 14 <section target="system_user" description="用户信息" relation="" sourceIdentityColumn="id" targetIdentityColumn="source_id" isEnabled="true"> 15 <table source="system_sync_pre_school_student" description="幼儿园学生信息" condition="" isEnabled="true"> 16 <column source="id" target="source_id" type="STRING" description="源数据与目标数据的对应值" filter="" replace="" isEnabled="true"/> 17 <column source="name" target="name" type="STRING" description="姓名" filter="" replace="" isEnabled="true"/> 18 <column source="sex" target="sex" type="STRING" description="性别" filter="" replace="男=1,女=0" isEnabled="true"/> 19 <column source="student_id" target="open_id" type="STRING" description="用户唯一openId" filter="" replace="" isEnabled="true"/> 20 </table> 21 </section> 22 23 </root>
2.写一个解析工具类:XMLUtil.java
1 package org.example.util; 2 3 import javax.xml.bind.JAXBContext; 4 import javax.xml.bind.JAXBException; 5 import javax.xml.bind.Marshaller; 6 import javax.xml.bind.Unmarshaller; 7 import java.io.*; 8 9 /** 10 * 封装了XML转换成object,object转换成XML的代码 11 */ 12 public class XMLUtil { 13 /** 14 * 将对象直接转换成String类型的 XML输出 15 */ 16 public static String convertToXml(Object obj) { 17 // 创建输出流 18 StringWriter sw = new StringWriter(); 19 try { 20 // 利用jdk中自带的转换类实现 21 JAXBContext context = JAXBContext.newInstance(obj.getClass()); 22 Marshaller marshaller = context.createMarshaller(); 23 // 格式化xml输出的格式 24 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, 25 Boolean.TRUE); 26 marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); 27 // 将对象转换成输出流形式的xml 28 marshaller.marshal(obj, sw); 29 } catch (JAXBException e) { 30 e.printStackTrace(); 31 } 32 return sw.toString(); 33 } 34 35 /** 36 * 将对象根据路径写入指定的xml文件里 37 * @param obj 38 * @param path 39 * @return 40 */ 41 public static void convertToXml(Object obj, String path) { 42 try { 43 // 利用jdk中自带的转换类实现 44 JAXBContext context = JAXBContext.newInstance(obj.getClass()); 45 46 Marshaller marshaller = context.createMarshaller(); 47 // 格式化xml输出的格式 48 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, 49 Boolean.TRUE); 50 marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK"); 51 // 将对象转换成输出流形式的xml 52 // 创建输出流 53 FileWriter fw = null; 54 try { 55 fw = new FileWriter(path); 56 } catch (IOException e) { 57 e.printStackTrace(); 58 } 59 marshaller.marshal(obj, fw); 60 } catch (JAXBException e) { 61 e.printStackTrace(); 62 } 63 } 64 65 /** 66 * 将String类型的xml转换成对象 67 */ 68 public static Object convertXmlStrToObject(Class<?> clazz, String xmlStr) { 69 Object xmlObject = null; 70 try { 71 JAXBContext context = JAXBContext.newInstance(clazz); 72 // 进行将Xml转成对象的核心接口 73 Unmarshaller unmarshal = context.createUnmarshaller(); 74 StringReader sr = new StringReader(xmlStr); 75 xmlObject = unmarshal.unmarshal(sr); 76 } catch (Exception e) { 77 e.printStackTrace(); 78 } 79 return xmlObject; 80 } 81 82 /** 83 * 将file类型的xml转换成对象 84 */ 85 public static Object convertXmlFileToObject(Class<?> clazz, String xmlPath) { 86 Object xmlObject = null; 87 try { 88 JAXBContext context = JAXBContext.newInstance(clazz); 89 Unmarshaller unmarshaller = context.createUnmarshaller(); 90 InputStreamReader isr=new InputStreamReader(new FileInputStream(xmlPath),"UTF-8"); 91 xmlObject = unmarshaller.unmarshal(isr); 92 } catch (Exception e) { 93 e.printStackTrace(); 94 } 95 return xmlObject; 96 } 97 98 }
3.按照XML结构,写出将要映射的实体类:
1)Root.java
1 package org.example.entity; 2 3 import lombok.Data; 4 5 import javax.xml.bind.annotation.XmlRootElement; 6 import java.util.List; 7 8 @Data 9 //注解用于标记当前类是XML的根节点,name值为根节点名 10 @XmlRootElement(name = "root") 11 public class Root { 12 13 private List<Section> section; 14 15 }
2)Section.java
1 package org.example.entity; 2 3 import lombok.Setter; 4 5 import javax.xml.bind.annotation.XmlAttribute; 6 import javax.xml.bind.annotation.XmlTransient; 7 import java.util.List; 8 9 @Setter 10 public class Section { 11 12 13 @XmlAttribute 14 private String target; 15 @XmlAttribute 16 private String description; 17 @XmlAttribute 18 private String relation; 19 @XmlAttribute 20 private String sourceIdentityColumn; 21 @XmlAttribute 22 private String targetIdentityColumn; 23 @XmlAttribute 24 private boolean isEnabled; 25 26 27 private List<Table> table; 28 29 @XmlTransient 30 public String getTarget() { 31 return target; 32 } 33 34 @XmlTransient 35 public String getDescription() { 36 return description; 37 } 38 39 @XmlTransient 40 public String getRelation() { 41 return relation; 42 } 43 44 @XmlTransient 45 public String getSourceIdentityColumn() { 46 return sourceIdentityColumn; 47 } 48 49 @XmlTransient 50 public String getTargetIdentityColumn() { 51 return targetIdentityColumn; 52 } 53 54 @XmlTransient 55 public boolean isEnabled() { 56 return isEnabled; 57 } 58 59 public List<Table> getTable() { 60 return table; 61 } 62 63 @Override 64 public String toString() { 65 return "Section{" + 66 "target=‘" + target + ‘\‘‘ + 67 ", description=‘" + description + ‘\‘‘ + 68 ", relation=‘" + relation + ‘\‘‘ + 69 ", sourceIdentityColumn=‘" + sourceIdentityColumn + ‘\‘‘ + 70 ", targetIdentityColumn=‘" + targetIdentityColumn + ‘\‘‘ + 71 ", isEnabled=" + isEnabled + 72 ", table=" + table + 73 ‘}‘; 74 } 75 }
3)Table.java
1 package org.example.entity; 2 3 import lombok.Setter; 4 5 import javax.xml.bind.annotation.XmlAttribute; 6 import javax.xml.bind.annotation.XmlTransient; 7 import java.util.List; 8 9 @Setter 10 public class Table { 11 12 @XmlAttribute 13 private String source; 14 @XmlAttribute 15 private String description; 16 @XmlAttribute 17 private String condition; 18 @XmlAttribute 19 private boolean isEnabled; 20 21 private List<Column> column; 22 23 @XmlTransient 24 public String getSource() { 25 return source; 26 } 27 28 @XmlTransient 29 public String getDescription() { 30 return description; 31 } 32 33 @XmlTransient 34 public String getCondition() { 35 return condition; 36 } 37 38 @XmlTransient 39 public boolean isEnabled() { 40 return isEnabled; 41 } 42 43 public List<Column> getColumn() { 44 return column; 45 } 46 47 @Override 48 public String toString() { 49 return "Table{" + 50 "source=‘" + source + ‘\‘‘ + 51 ", description=‘" + description + ‘\‘‘ + 52 ", condition=‘" + condition + ‘\‘‘ + 53 ", isEnabled=" + isEnabled + 54 ", column=" + column + 55 ‘}‘; 56 } 57 }
4)Column.java
1 package org.example.entity; 2 3 import lombok.Setter; 4 5 import javax.xml.bind.annotation.XmlAttribute; 6 import javax.xml.bind.annotation.XmlTransient; 7 8 @Setter 9 public class Column { 10 11 @XmlAttribute 12 private String source; 13 @XmlAttribute 14 private String target; 15 @XmlAttribute 16 private String type; 17 @XmlAttribute 18 private String description; 19 @XmlAttribute 20 private String filter; 21 @XmlAttribute 22 private String replace; 23 @XmlAttribute 24 private boolean isEnabled; 25 26 @XmlTransient 27 public String getSource() { 28 return source; 29 } 30 31 @XmlTransient 32 public String getTarget() { 33 return target; 34 } 35 36 @XmlTransient 37 public String getType() { 38 return type; 39 } 40 41 @XmlTransient 42 public String getDescription() { 43 return description; 44 } 45 46 @XmlTransient 47 public String getFilter() { 48 return filter; 49 } 50 51 @XmlTransient 52 public String getReplace() { 53 return replace; 54 } 55 56 @XmlTransient 57 public boolean isEnabled() { 58 return isEnabled; 59 } 60 61 @Override 62 public String toString() { 63 return "Column{" + 64 "source=‘" + source + ‘\‘‘ + 65 ", target=‘" + target + ‘\‘‘ + 66 ", type=‘" + type + ‘\‘‘ + 67 ", description=‘" + description + ‘\‘‘ + 68 ", filter=‘" + filter + ‘\‘‘ + 69 ", replace=‘" + replace + ‘\‘‘ + 70 ", isEnabled=" + isEnabled + 71 ‘}‘; 72 } 73 }
4.编写一个测试类
1 package org.example; 2 3 import org.example.entity.Root; 4 import org.example.util.XMLUtil; 5 6 public class Test { 7 8 public static void main(String[] args) { 9 10 String path = "config.xml"; 11 Root root = (Root) XMLUtil.convertXmlFileToObject(Root.class, path); 12 System.out.println(root); 13 14 } 15 }
5.文件结构
附:lambok 引用
1 <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> 2 <dependency> 3 <groupId>org.projectlombok</groupId> 4 <artifactId>lombok</artifactId> 5 <version>1.18.20</version> 6 <scope>provided</scope> 7 </dependency>
评论(0)