首页 > 代码库 > 解析服务器端回传 XML 文件并封装为对象

解析服务器端回传 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>

 

结尾

以上就是我的解决方案了,思路比较简单,实现也很粗暴,如果有更好的方案,欢迎交流。

解析服务器端回传 XML 文件并封装为对象