解析服务器端回传 XML 文件并封装为对象
起因
项目的上游数据对接方通过XML文件与主体项目进行通信,获取其XML的方法为通过HTTP的GET请求返回XML文件,之前还未遇到过这种传递方式,就稍微查了一下资料,写了一个出来,如果你也有类似的需求,可供参考。
正文
整个“接收-存储-查询-赋值”由两个模块组成,即“接收-存储”与“查询-赋值”,配合一个用于封装的实体类与一个提高复用性的“Date-String”转换工具类。
整体的思路很简单,首先用java的“URLConnection”类与上游数据提供方服务器(以下称“服务器”)建立通信,并将相应以输入流的形式写出XML用作存储(备份);之后由dom4j进行XML文件的解析和实体对象的封装。
现在贴出具体的实现:
服务器通信&存储方法(XMLReceiver):
package util;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
public class XMLReceiver {
public static String sendGet(String url, String path) {
BufferedReader in = null;
try {
FileWriter fw = new FileWriter(path);
URL realUrl = new URL(url);
URLConnection conn = realUrl.openConnection();
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
conn.connect();
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
fw.write(line + "\r\n");
}
fw.close();
} catch (Exception e) {
System.out.println("请求异常!" + e);
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return path;
}
}
XML解析方法(XMLReader):
package util;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import model.Example;
public class XMLReader {
public static List<Example> getData (String path) {
List<Example> exmList = new ArrayList<Example>();
try {
File f = new File(path);
SAXReader reader = new SAXReader();
Document doc = reader.read(f);
Element root = doc.getRootElement();
Element foo;
for (Iterator<?> i = root.elementIterator("exm"); i.hasNext();) {
Example exm = new Example();
foo = (Element) i.next();
exm.setIntValue(Integer.parseInt(foo.elementText("intValue")));
exm.setLongValue(Long.parseLong(foo.elementText("longValue")));
exm.setStringValue(foo.elementText("stringValue"));
exm.setDateValue(DateStringSwitcher.stringToDate(foo.elementText("dateValue")));
exm.setDoubleValue(Double.parseDouble(foo.elementText("doubleValue")));
exmList.add(exm);
}
} catch (Exception e) {
e.printStackTrace();
}
return exmList;
}
}
封装用的实体类:
package model;
import java.util.Date;
public class Example {
private int intValue;
private long longValue;
private String stringValue;
private Date dateValue;
private double doubleValue;
//geter and setter
}
方便复用的转换方法(如不考虑复用,可以直接写在方法里):
package util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateStringSwitcher {
private static SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
public static String dataToString(Date date){
String str=sdf.format(date);
return str;
}
public static Date stringToDate(String str){
Date date = new Date();
try {
date = sdf.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
最后是调用的方法:
package test;
import java.util.List;
import model.Example;
import util.XMLReader;
import util.XMLReceiver;
public class XMLTest {
public static void main(String[] args) {
//第一个参数是会返回XML文件的地址,第二个参数是文件存储的位置
//这里使用nginx静态服务器进行实验
String path = XMLReceiver.sendGet("http://localhost:8099/", "D:/test2.xml");
List<Example> exmList = XMLReader.getData(path);
System.out.println(exmList); //重写pojo的toString方法即可看到显示内容
}
}
最后附上XML文件的格式,如果格式有变动,只需在XMLReader的"root"上做手脚即可。
<?xml version="1.0" encoding="utf-8"?> <root> <exm> <intValue>1</intValue> <longValue>12345678910</longValue> <stringValue>测试1</stringValue> <dateValue>2017/1/1 7:07:07</dateValue> <doubleValue>1.11</doubleValue> </exm> <exm> <intValue>2</intValue> <longValue>12345678910</longValue> <stringValue>测试2</stringValue> <dateValue>2017/1/1 7:07:07</dateValue> <doubleValue>2.22</doubleValue> </exm> <exm> <intValue>3</intValue> <longValue>12345678910</longValue> <stringValue>测试3</stringValue> <dateValue>2017/1/1 7:07:07</dateValue> <doubleValue>3.33</doubleValue> </exm> </root>
结尾
以上就是我的解决方案了,思路比较简单,实现也很粗暴,如果有更好的方案,欢迎交流。