前言
在工作中有次遇到过webservice传递数据,以xml的格式。字段根据接口来设计,但是我们实体类是自动生成打了jar, 所以对解析时候造成了困难。弄了好久最后选择使用JDOM+反射机制解析。成功执行,总算是弄好了这个大问题
下面是代码
maven依赖
<dependency>
<groupId>jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.1</version>
</dependency>
代码
XmlUtil.java
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import java.io.StringReader;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @Description: 利用反射和JDOM解析xml成bean/List
* @Date: 2018/1/22 16:06
*/
public class XmlUtil {
/**
* xml转换成bean
* @param xml
* @param obj
* @return
*/
public static Object xmlToBean(String xml,Class obj){
SAXBuilder builder=new SAXBuilder();
Field[] fields = obj.getDeclaredFields();
String beanName=obj.getSimpleName();
try {
Object object = Class.forName(obj.getName()).newInstance();
Document doc = builder.build(new StringReader(xml));
Element books = doc.getRootElement();
List booklist = books.getChildren(beanName);
for (Iterator iter = booklist.iterator(); iter.hasNext(); ) {
Element book = (Element) iter.next();
for (int j = 0; j < fields.length; j++) {
fields[j].setAccessible(true);
if (!fields[j].toString().contains("final")) {
fields[j].set(object,book.getChildTextTrim(fields[j].getName())==null?"":book.getChildTextTrim(fields[j].getName()));
}
}
}
System.out.println(fields.toString());
return object;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* xml转换成list
* @param xml
* @param obj
* @return
*/
public static List<?> xmlToList(String xml,Class obj){
SAXBuilder builder=new SAXBuilder();
Field[] fields = obj.getDeclaredFields();
String beanName=obj.getSimpleName();
try {
Object object = Class.forName(obj.getName()).newInstance();
List<Object> list=new ArrayList<Object>();
Document doc = builder.build(new StringReader(xml));
Element books = doc.getRootElement();
List booklist = books.getChildren(beanName);
for (Iterator iter = booklist.iterator(); iter.hasNext(); ) {
Element book = (Element) iter.next();
for (int j = 0; j < fields.length; j++) {
fields[j].setAccessible(true);
if (!fields[j].toString().contains("final")) {
fields[j].set(object,book.getChildTextTrim(fields[j].getName())==null?"":book.getChildTextTrim(fields[j].getName()));
}
}
list.add(object);
}
return list;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* bean转换成xml
*/
public static String beanToXmls(Object obj){
Class t=(Class)obj.getClass();
Field[] fields = t.getDeclaredFields();
StringBuffer buffer=new StringBuffer();
buffer.append("<Data><Vehicle>");
try {
Object object = Class.forName(obj.getClass().getName()).newInstance();
for (int j = 0; j < fields.length; j++) {
fields[j].setAccessible(true);
String val = fields[j].get(obj)==null?"": fields[j].get(obj)+"";
buffer.append("<"+fields[j].getName()+">"+val+"</"+fields[j].getName()+">\n");
}
buffer.append("</Data></Vehicle>");
return buffer.toString();
}catch(Exception e){
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
List<IMType> o= (List<IMType>) xmlToList("<Data> <IMType> <InspectionNum>4416020120130730160935272</InspectionNum> <StationCode>441600002</StationCode> <HCEL>0.2</HCEL> <HCER>0.2</HCER> <HCED>1</HCED> <COEL>0.2</COEL> <COER>0.2</COER> <COED>1</COED> <NOXEL>0.2</NOXEL> <NOXER>0.2</NOXER> <NOXED>1</NOXED> <HCNOXEL>0.2</HCNOXEL> <HCNOXER>0.2</HCNOXER> <HCNOXED>1</HCNOXED> </IMType></Data> ",IMType.class);
System.out.println(o.get(0).getCOEL());
}
工具类可自行修改 我是根据需求来写的
顺便实体类也发给你们吧
IMType.java
public class IMType implements Serializable{
private String id = "";
private String StationCode = "";
private String InspectionNum = "";
private String HCEL = "";
private String HCER = "";
private String HCED = "";
private String COEL = "";
private String COER = "";
private String COED = "";
private String NOXEL = "";
private String NOXER = "";
private String NOXED = "";
private String HCNOXEL = "";
private String HCNOXER = "";
private String HCNOXED = "";
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getStationCode() {
return StationCode;
}
public void setStationCode(String stationCode) {
StationCode = stationCode;
}
public String getInspectionNum() {
return InspectionNum;
}
public void setInspectionNum(String inspectionNum) {
InspectionNum = inspectionNum;
}
public String getHCEL() {
return HCEL;
}
public void setHCEL(String hCEL) {
HCEL = hCEL;
}
public String getHCER() {
return HCER;
}
public void setHCER(String hCER) {
HCER = hCER;
}
public String getHCED() {
return HCED;
}
public void setHCED(String hCED) {
HCED = hCED;
}
public String getCOEL() {
return COEL;
}
public void setCOEL(String cOEL) {
COEL = cOEL;
}
public String getCOER() {
return COER;
}
public void setCOER(String cOER) {
COER = cOER;
}
public String getCOED() {
return COED;
}
public void setCOED(String cOED) {
COED = cOED;
}
public String getNOXEL() {
return NOXEL;
}
public void setNOXEL(String nOXEL) {
NOXEL = nOXEL;
}
public String getNOXER() {
return NOXER;
}
public void setNOXER(String nOXER) {
NOXER = nOXER;
}
public String getNOXED() {
return NOXED;
}
public void setNOXED(String nOXED) {
NOXED = nOXED;
}
public String getHCNOXEL() {
return HCNOXEL;
}
public void setHCNOXEL(String hCNOXEL) {
HCNOXEL = hCNOXEL;
}
public String getHCNOXER() {
return HCNOXER;
}
public void setHCNOXER(String hCNOXER) {
HCNOXER = hCNOXER;
}
public String getHCNOXED() {
return HCNOXED;
}
public void setHCNOXED(String hCNOXED) {
HCNOXED = hCNOXED;
}