最近做了一个接口,发送请求的xml字符串得到另一个项目的返回的xml字符串,再进行解析,解析之后把数据存储到数据库中。自己记录下这个过程,以便以后用得到。
返回的xml字符串是这种形式的
<?xml version="1.0" encoding="utf-8"?>
<ROOT>
<HEAD>
<LINES>2</LINES>
</HEAD>
<ITEM>
<A>9200</A>
<B>01101024</B>
<C>2017</C>
<D>利润中心</D>
<E>利润中心名称</E>
</ITEM>
<ITEM>
<A>9300</A>
<B>01101012</B>
<C>2017</C>
<D>利润中心</D>
<E>利润中心名称</E>
</ITEM>
<ROOT>
我需要解析此xml并把各个节点的值放入到javabean中。
首先创建一个实体类fwspsapEntity
public class fwspsapEntity {
String A;//公司代码
String B;//会计凭证编号
String C;
String D;
String E;
//省略setter和getter
}
然后进行解析操作,并把值放入到bean中,再把bean放入到map里,返回一个map类型的值,以便后续功能。
public static Map<String, Object> xmlElements(String xmlDoc) {
List list = new ArrayList<String>();
int index = 0;
Map<String, Object> retmap = new HashMap<String, Object>();
// 创建一个新的字符串
StringReader read = new StringReader(xmlDoc);
// 创建新的输入源SAX解析器将使用InputSource对象来确定如何读取XML输入
InputSource source = new InputSource(read);
// 创建一个新的SAXBuilder
SAXBuilder sb = new SAXBuilder();
try {
// 通过输入源构造一个Document
Document doc = sb.build(source);
// 取的根元素
Element root = doc.getRootElement();
System.out.println(root.getName());//输出根元素的名称(测试)
// 得到根元素所有子元素的集合
List jiedian = root.getChildren();
Element et = null;
Element et1 = null;
et1 = (Element)jiedian.get(0);
int lines = Integer.parseInt(et1.getChildText("LINES"));
System.out.println(lines);
for(int i=1;i<jiedian.size();i++){
et = (Element) jiedian.get(i);
String A= et.getChildText("A");
String B= et.getChildText("B");
String C = et.getChildText("C");
String D = et.getChildText("D");
String E = et.getChildText("E");
fwspsapEntity entity = new fwspsapEntity();
entity.setA(A);
entity.setB(B);
entity.setC(C);
entity.setD(D);
entity.setE(E);
index++;
retmap.put(index+"",entity);
}
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return retmap;
}
//这一段代码是得到上面的方法返回的map,得到map里面的实体,实体有一个或多个,然后//循环得到实体的数据,进行插入表操作
map = xmlElements(out_str);
if(map!=null){
Set<String> finkey = map.keySet();
String operSql = "";
for (Iterator it = finkey.iterator(); it.hasNext();){
String s = (String) it.next();
if (map.get(s) != null){
fwspsapEntity entity = (fwspsapEntity) map.get(s);
operSql = "insert into my_table(A,B,C,D,E)"
+ "values('"
+entity.getA()+"','"
+entity.getB()+"',"
+entity.getC()+",'"
+entity.getD()+"','"
+entity.getE()+"'
+")";
System.out.println(operSql);
//数据库操作
Connection conn = DbcpUtil.getConnection();
Statement stat = null;
PreparedStatement ps = null;
try{
conn.setAutoCommit(false);
stat = conn.createStatement();
ps = conn.prepareStatement(operSql);
ps.execute();
conn.commit();
}catch(Exception e){
e.printStackTrace();
}finally{
try {
ps.close();
DbcpUtil.close(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
数据库的用户名和密码等是放在一个properties文件里的,通过ResourceBundle获取用户名密码等
dbInfo.properties:
orcl_driver=oracle.jdbc.OracleDriver
orcl_url=jdbc:oracle:thin:@localhost:1521:orcl
username=name
pwd=123456
PropertiesUtil.java:
import java.util.ResourceBundle;
public class PropertiesUnit {
public static ResourceBundle getResourceBundle(){
ResourceBundle retrb = ResourceBundle.getBundle("com.zl.util.dbInfo");
return retrb;
}
}
DbcpUtil.java:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ResourceBundle;
public class DbcpUtil {
static ResourceBundle rb = PropertiesUnit.getResourceBundle();
static String url =rb.getString("orcl_url");
static String username =rb.getString("username");
static String password =rb.getString("pwd");
static String driver = rb.getString("orcl_driver");
public static Connection getConnection(){
Connection conn = null;
try{
Class.forName(driver);
conn = DriverManager.getConnection(url,username,password);
}catch(Exception e){
e.printStackTrace();
}
return conn;
}
public static void close(Connection conn){
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception {
System.out.println(getConnection());
}
}