起因
项目的上游数据对接方通过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>
结尾
以上就是我的解决方案了,思路比较简单,实现也很粗暴,如果有更好的方案,欢迎交流。