一、 概述:存儲員工的xml文件過多且內容無規律,爲了方便簡單的查看,要將xml中的內容按要求分開寫入txt文件中,並打包歸檔。
二、 目標概述:分析staff_.zip內xml,將符合要求(見三)的員工數據按規定(見四)寫入txt文件,將多個輸出文件打包爲staff_select.zip,DB記錄生成zip的路徑和時間YYYY:mm:dd HH:mm:ss
staff_.zip中employees.xml的樣例:
<employees>
<!--Employee Xml Catalog-->
<employee name="FHK ZY#E" number="65253008">
<public>
<department>PRM</department>
<group>PRM 7</group>
</public>
<individual>
<name>FHK ZY#E</name>
<number>65253008</number>
<gender>Male</gender>
<age>91</age>
<phoneno>160296718242</phoneno>
<workexperience>7</workexperience>
</individual>
</employee>
<employee name="RHUZJJAE" number="25904879">
<public>
<department>OCS</department>
<group>OCS 1</group>
</public>
<individual>
<name>RHUZJJAE</name>
<number>25904879</number>
<gender>Male</gender>
<age>81</age>
<phoneno>697165507224</phoneno>
<workexperience>4</workexperience>
</individual>
</employee>
<employee name="JVPS#M X" number="88536762">
<public>
<department>Human Resources</department>
<group>Human Resources 6</group>
</public>
<individual>
<name>JVPS#M X</name>
<number>88536762</number>
<gender>Male</gender>
<age>81</age>
<phoneno>682619863271</phoneno>
<workexperience>3</workexperience>
</individual>
</employee>
</employees>
jdbc.properties:
driverClassName=oracle.jdbc.xa.client.OracleXADataSource
url=jdbc:oracle:thin:@127.0.0.1:1521:ibss
userName=ibss
password=ibss
maxSize=10
minSize=8
idleTimeout=10
checkOutTimeout=10000
testsql=select count(*) from dual
checkAfterUsed=true
isSameRM=false
invalidCondition.properties:
#name validation
origName=$,#,&
targName=*
#age validation
minAge=18
maxAge=38
#gender validation
gender=Other
三、 Xml解析要求:xml中數據有些不符合要求,
1、要根據invalidCondition.properties文件中的條件過濾篩選符合要求(有效)的員工,不符合要求的員工信息不寫入txt文件中。
#name validation(員工姓名中含有 #或$或&的要將其轉換爲*)
origName=$,#,&
targName=*
#age validation(年齡小於18大於48的員工不合法)
minAge=18
maxAge=48
#gender validation(性別爲Other的員工不合法)
gender=Other
2、員工工號相同情況不考慮
3、員工姓名去前後空格
四、 txt格式要求:
1、 txt文件名:“部門名”(該txt內員工數據均爲文件名所示部門的員工)。
2、 txt文件格式:員工按部門組(從小到大)順序排列
#Department:CRM(部門總人數:部門有效人數)
deptGroup=0
staffNo=*****
staffName=*****
staffGender=*****
staffAge=*****
phoneNumber=*****
workExp=***** Year(Years)
#-------------------------
五、 歸檔要求(可選功能):
讀取jdbc中的參數,連接數據庫,記錄文件生成時間和路徑,表(EMPLOYEE_ZIP)結構:
CreateTime VarChar2(1024)
ZipPath Varchar2(1024)
六、 提交要求:
自己創建工程,工程目錄結構自定義,完成試題後將整個工程目錄壓縮爲:
“姓名_.zip”發給xxx
七、 java代碼實現:
1、元數據bean類:
package nju.syy.vo;
import java.util.ArrayList;
public class EmployeeBean {
private String name;
private String number;
private String department;
private String group;
private String gender;
private String age;
private String phoneno;
private String workExperience;
private static ArrayList<EmployeeBean> employeeList = new ArrayList<EmployeeBean>();
public EmployeeBean employeeBean;
public EmployeeBean(EmployeeBean eb) {
this.employeeBean = eb;
}
public EmployeeBean() {
// TODO Auto-generated constructor stub
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public String getGroup() {
return group;
}
public void setGroup(String group) {
this.group = group;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getPhoneno() {
return phoneno;
}
public void setPhoneno(String phoneno) {
this.phoneno = phoneno;
}
public String getWorkExperience() {
return workExperience;
}
public void setWorkExperience(String workExperience) {
this.workExperience = workExperience;
}
public EmployeeBean getEmployeeBean() {
return employeeBean;
}
public void setEmployeeBean(EmployeeBean employeeBean) {
this.employeeBean = employeeBean;
}
public ArrayList<EmployeeBean> getEmployeeList() {
return employeeList;
}
@SuppressWarnings("static-access")
public void setEmployeeList(ArrayList<EmployeeBean> employeeList) {
this.employeeList = employeeList;
}
}
2、控制service類:
package nju.syy.service;
import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Map.Entry;
import nju.syy.util.OralceConnect;
import nju.syy.util.PropertiesUtil;
import nju.syy.util.TxtUtil;
import nju.syy.util.ZipUtil;
import nju.syy.vo.EmployeeBean;
public class EmloyeeHandle {
ArrayList<EmployeeBean> employeeList = new ArrayList<EmployeeBean>();
Map<String, Integer> countMap = new HashMap<String, Integer>();
PropertiesUtil pu = new PropertiesUtil();
Map<String, String> propertiesMap = pu
.readTxtFormatProperties("invalidCondition.properties");
public Map<String, Integer> getCountMap(){
return countMap;
}
private void readXMLFile(String zipFile) {
ZipUtil zipUtil = new ZipUtil();
employeeList = zipUtil.unZipFile(zipFile);
}
public void writeToTxtFile() {
TxtUtil tu = new TxtUtil();
tu.writeToTxtFile(employeeList);
}
public boolean isValidEmployee(EmployeeBean eb) {
int age = Integer.parseInt(eb.getAge());
int minAge = Integer.parseInt(propertiesMap.get("minAge"));
int maxAge = Integer.parseInt(propertiesMap.get("maxAge"));
if ((eb.getGender() .equals(propertiesMap.get("gender")) ) || (age < minAge)
|| (age > maxAge))
return false;
else
return true;
}
public void transfer(EmployeeBean eb) {
String origName = propertiesMap.get("origName");
String targName = propertiesMap.get("targName");
String[] origNames = origName.split(",");
String pattern = new String();
for (String str : origNames) {
pattern += (str + "|");
}
eb.setName(eb.getName().replaceAll("[" + pattern + "]", targName));
}
/**
* 分組
*
* @param employeeList
*/
public Map<String, LinkedList<EmployeeBean>> grouped(
ArrayList<EmployeeBean> employeeList) {
Map<String, LinkedList<EmployeeBean>> employeeGroupMap = new HashMap<String, LinkedList<EmployeeBean>>();
EmloyeeHandle eh = new EmloyeeHandle();
for (EmployeeBean eb : employeeList) {
LinkedList<EmployeeBean> ebList;
String department = eb.getDepartment();
if (employeeGroupMap.containsKey(department)) {
countMap.put(department, countMap.get(department) + 1);
if (eh.isValidEmployee(eb)) {
eh.transfer(eb);
ebList = employeeGroupMap.get(department);
addUpSort(eb, ebList);
employeeGroupMap.put(department, ebList);
}
} else {
countMap.put(department, 1);
ebList = new LinkedList<EmployeeBean>();
employeeGroupMap.put(department, ebList);
if (eh.isValidEmployee(eb)) {
eh.transfer(eb);
addUpSort(eb, ebList);
}
}
}
for(java.util.Iterator<Entry<String, Integer>> iterator = countMap.entrySet().iterator(); iterator.hasNext();){
Entry<String, Integer> entry = iterator.next();
String key = entry.getKey();
Integer count = entry.getValue();
System.out.println("Department: " + key + ", count: " + count);
}
return employeeGroupMap;
}
/**
* 升序算法含義: 1、首先判斷新增元素和元素集合不能爲null; 2、判斷元素集合是否爲空,如果爲空則將當前新增元素插入到鏈表的表頭
* 3、如果不是第二種情況則需要遍歷整個鏈表,查看是否有已存在元素比當前新增元素大, 如果有則將當前元素插入到已存在元素的位置
* 4、如果遍歷到最後一個位置沒有比當前新增元素大,那麼就將新增元素插入到鏈表的最後一個位置
*
*/
@SuppressWarnings("unused")
public void addUpSort(EmployeeBean eb, LinkedList<EmployeeBean> ebList) {
String curGroup = eb.getGroup();
String[] str = curGroup.split(" ");
int curGroupNo = Integer.parseInt(str[str.length - 1]);
if (eb == null) {
try {
throw new Exception("插入元素爲null");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (ebList == null) {
try {
throw new Exception("元素集合爲null");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (ebList.size() == 0) {
ebList.add(eb);
} else {
String firstGroup = ebList.getFirst().getGroup();
String[] str1 = firstGroup.split(" ");
int firstGroupNo = Integer.parseInt(str1[str1.length - 1]);
if (curGroupNo < firstGroupNo) {
ebList.addFirst(eb);
} else {
boolean insertFlag = false;
for (EmployeeBean e : ebList) {
String group = e.getGroup();
String[] str2 = group.split(" ");
int groupNo = Integer.parseInt(str2[str2.length - 1]);
if (curGroupNo < groupNo) {
int index = ebList.indexOf(e);
ebList.add(index, eb);
insertFlag = true;
break;
}
}
if (!insertFlag) {
ebList.addLast(eb);
}
}
}
}
/**
* 保存生成zip的路徑和時間到DB
*/
public void save(){
OralceConnect oralceConnect = new OralceConnect();
Connection conn = oralceConnect.connectToOracle();
PreparedStatement pstmt = null;
ResultSet rs = null;
String directory = System.getProperty("user.dir");
File file =new File(directory + "\\staff_select.zip");
Long time =file.lastModified();
Calendar cd = Calendar.getInstance();
cd.setTimeInMillis(time);
System.out.println(cd.getTime());
try
{
pstmt = conn.prepareStatement("INSERT INTO EMPLOYEE_ZIP (CreateTime, ZipPath) VALUES ('" + cd.getTime() + "', '"+file.getAbsolutePath() + "')");
rs = pstmt.executeQuery();
System.out.println("數據庫操作成功!");
}catch(SQLException e){
System.out.println("數據庫操作異常!" + e.getMessage());
}
finally{
try{
if(rs!= null){rs.close();}
if(pstmt!= null){pstmt.close();}
if(conn != null && !conn.isClosed()){conn.close();}
}catch(SQLException e){
e.printStackTrace();
}
}
}
public static void main(String[] args) {
EmloyeeHandle emloyeeHandle = new EmloyeeHandle();
ZipUtil zu = new ZipUtil();
emloyeeHandle.readXMLFile("staff_.zip");
emloyeeHandle.writeToTxtFile();
String directory = System.getProperty("user.dir");
try {
zu.zip(directory + "\\staff_select");// 要壓縮的文件夾
} catch (Exception ex) {
ex.printStackTrace();
}
emloyeeHandle.save();
}
}
3、工具util類:
package nju.syy.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Map;
public class OralceConnect {
/**
* @param args
*/
public Connection connectToOracle() {
PropertiesUtil pu = new PropertiesUtil();
Map<String, String> propertiesMap = pu
.readJdbcProperties("jdbc.properties");
Connection conn = null; //Connection數據庫連接對象
try {
// 註冊驅動
// Class.forName(propertiesMap.get("driverClassName"));
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(propertiesMap.get("url"), propertiesMap.get("userName"), propertiesMap.get("password"));
return conn;
} catch (ClassNotFoundException e) {
System.out.println("驅動類沒有找到!");
} catch(SQLException e){
System.out.println("獲得Connection數據庫連接對象出錯!!");
e.printStackTrace();
}
return conn;
}
}
package nju.syy.util;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class PropertiesUtil {
public Properties parserProperties(String propertiesFileName) {
FileInputStream filein;
Properties p = new Properties();
try {
filein = new FileInputStream(propertiesFileName);
try {
p.load(filein);
return p;
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return p;
}
/**
* 讀提txt文件的配置文檔
* @param propertiesFileName
* @return
*/
public Map<String, String> readTxtFormatProperties(String propertiesFileName) {
Map<String, String> propertiesMap = new HashMap<String, String>();
Properties p = parserProperties(propertiesFileName);
propertiesMap.put("origName", p.getProperty("origName"));
propertiesMap.put("targName", p.getProperty("targName"));
propertiesMap.put("minAge", p.getProperty("minAge"));
propertiesMap.put("maxAge", p.getProperty("maxAge"));
propertiesMap.put("gender", p.getProperty("gender"));
return propertiesMap;
}
/**
* 讀jdbc的配置文檔
* @param propertiesFileName
* @return
*/
public Map<String, String> readJdbcProperties(String propertiesFileName) {
Map<String, String> propertiesMap = new HashMap<String, String>();
Properties p = parserProperties(propertiesFileName);
propertiesMap.put("driverClassName", p.getProperty("driverClassName"));
propertiesMap.put("url", p.getProperty("url"));
propertiesMap.put("userName", p.getProperty("userName"));
propertiesMap.put("password", p.getProperty("password"));
propertiesMap.put("maxSize", p.getProperty("maxSize"));
propertiesMap.put("minSize", p.getProperty("minSize"));
propertiesMap.put("idleTimeout", p.getProperty("idleTimeout"));
propertiesMap.put("checkOutTimeout", p.getProperty("checkOutTimeout"));
propertiesMap.put("testsql", p.getProperty("testsql"));
propertiesMap.put("checkAfterUsed", p.getProperty("checkAfterUsed"));
propertiesMap.put("isSameRM", p.getProperty("isSameRM"));
return propertiesMap;
}
public static void main(String[] arg){
PropertiesUtil pu = new PropertiesUtil();
Map<String, String> propertiesMap = pu
.readJdbcProperties("jdbc.properties");
System.out.println(propertiesMap.get("driverClassName"));
}
}
package nju.syy.util;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import nju.syy.service.EmloyeeHandle;
import nju.syy.vo.EmployeeBean;
public class TxtUtil {
@SuppressWarnings({ "unchecked", "rawtypes" })
public void writeToTxtFile(ArrayList<EmployeeBean> employeeList) {
try {
EmloyeeHandle eh = new EmloyeeHandle();
Map<String, LinkedList<EmployeeBean>> employeeGroupMap = eh
.grouped(employeeList);
Map<String, Integer> countMap = eh.getCountMap();
for (Iterator iterator = employeeGroupMap.entrySet().iterator(); iterator
.hasNext();) {
Map.Entry entry = (Map.Entry) iterator.next();
String key = (String) entry.getKey();
LinkedList<EmployeeBean> ebList = (LinkedList<EmployeeBean>) entry
.getValue();
String directory = System.getProperty("user.dir");
File staff_select_File = new File(directory + "\\staff_select");
staff_select_File.mkdir();
BufferedWriter bw = new BufferedWriter(new FileWriter(new File(
staff_select_File.getCanonicalPath() + "\\" + key + ".txt")));
StringBuffer bf = new StringBuffer();
bf.append("#Department:" + key + "(" + countMap.get(key) + " : " + ebList.size() + ")" + "\r\n" + "\r\n");
for (Iterator i = ebList.iterator(); i.hasNext();) {
EmployeeBean eb = (EmployeeBean) i.next();
String gourp = eb.getGroup();
String[] strs = gourp.split(" ");
String groupNo = strs[strs.length - 1];
bf.append("deptGroup=" + groupNo + "\r\n");
bf.append("staffNo=" + eb.getNumber() + "\r\n");
bf.append("staffName=" + eb.getName() + "\r\n");
bf.append("staffGender=" + eb.getGender() + "\r\n");
bf.append("staffAge=" + eb.getAge() + "\r\n");
bf.append("phoneNumber=" + eb.getPhoneno() + "\r\n");
bf.append("workExp=" + eb.getWorkExperience()
+ " Year(Years)" + "\r\n"
+ "#-------------------------" + "\r\n");
}
bw.append(bf);
bw.flush();
bw.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void zipFile(String zipFileName) throws IOException {
// 1. 創建zip輸出流
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
zipFileName));
// 2. 創建並設置條目信息
File f = new File("javaio.bmp");
ZipEntry ze = new ZipEntry(f.getName());
ze.setComment("Hello, Zip");
ze.setSize(f.length());
ze.setTime(f.lastModified());
// 3. 添加條目到輸出流
zos.putNextEntry(ze);
// 4. 輸出
FileInputStream fin = new FileInputStream(f);
byte[] buffer = new byte[4096];
int len;
while ((len = fin.read(buffer)) != -1) {
zos.write(buffer, 0, len);
}
fin.close();
// 5. 關閉流
zos.close();
}
}
package nju.syy.util;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import nju.syy.vo.EmployeeBean;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
*
* @author hongliang.dinghl Dom4j 生成XML文檔與解析XML文檔
*/
public class XMLUtil {
public ArrayList<EmployeeBean> parserXml(InputStream inputStream) {
EmployeeBean employeeBean = new EmployeeBean();
SAXReader saxReader = new SAXReader();
try {
Document document = saxReader.read(inputStream);
Element employees = document.getRootElement();
for (Iterator<?> i = employees.elementIterator(); i.hasNext();) {
EmployeeBean eb = new EmployeeBean();
Element employee = (Element) i.next();
// 取employee的姓名屬性
eb.setName(employee.attributeValue("name"));
// 取employee的編號屬性
eb.setNumber(employee.attributeValue("number"));
Iterator<?> j = employee.elementIterator();
Element publics = (Element) j.next();
// 取"部門"元素
Iterator<?> i_publics = publics.elementIterator();
Element department = (Element) i_publics.next();
eb.setDepartment(department.getTextTrim());
// 取"小組"元素
Element group = (Element) i_publics.next();
eb.setGroup(group.getTextTrim());
// -----------------------------------------------------------------
// 取"個人信息"元素
Element individuals = (Element) j.next();
// 取"性別"元素
Iterator<?> i_individuals = individuals.elementIterator();
i_individuals.next();
i_individuals.next();
Element gender = (Element) i_individuals.next();
eb.setGender(gender.getTextTrim());
// 取"年齡"元素
Element age = (Element) i_individuals.next();
eb.setAge(age.getTextTrim());
// 取"電話號碼"元素
Element phoneno = (Element) i_individuals.next();
eb.setPhoneno(phoneno.getTextTrim());
// 取"工作經驗"元素
Element workexperience = (Element) i_individuals.next();
eb.setWorkExperience(workexperience.getTextTrim());
employeeBean.getEmployeeList().add(eb);
}
} catch (DocumentException e) {
System.out.println(e.getMessage());
}
// System.out.println(employeeBean.getEmployeeList().size());
return employeeBean.getEmployeeList();
}
}
package nju.syy.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import nju.syy.vo.EmployeeBean;
public class ZipUtil {
ArrayList<EmployeeBean> employeeList = new ArrayList<EmployeeBean>();
XMLUtil xu = new XMLUtil();
/**
* 依次讀取壓縮包中各文件內容
*
* @param file
*/
@SuppressWarnings("unchecked")
public ArrayList<EmployeeBean> unZipFile(String zipFileName) {
try {
// 由指定的File對象打開供閱讀的ZIP文件
ZipFile zip = new ZipFile(new File(zipFileName));
// 獲取zip文件中的各條目(子文件)
Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip
.entries();
// 依次訪問各條目
while (entries.hasMoreElements()) {
ZipEntry ze = (ZipEntry) entries.nextElement();
employeeList = xu.parserXml(zip.getInputStream(ze));
}
} catch (ZipException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return employeeList;
}
/**
* 依次將txt文件壓縮到staff_select.zip文件中
*
* @param file
*/
public void zip(String inputFileName) throws Exception {
String directory = System.getProperty("user.dir");
String zipFileName = directory + "\\staff_select.zip"; // 打包後文件名字
// System.out.println(zipFileName);
zip(zipFileName, new File(inputFileName));
}
private void zip(String zipFileName, File inputFile) throws Exception {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
zipFileName));
zip(out, inputFile, "");
out.close();
}
private void zip(ZipOutputStream out, File f, String base) throws Exception {
if (f.isDirectory()) {
File[] fl = f.listFiles();
out.putNextEntry(new ZipEntry(base + "/"));
base = base.length() == 0 ? "" : base + "/";
for (int i = 0; i < fl.length; i++) {
zip(out, fl[i], base + fl[i].getName());
}
} else {
out.putNextEntry(new ZipEntry(base));
FileInputStream in = new FileInputStream(f);
int b;
while ((b = in.read()) != -1) {
out.write(b);
}
in.close();
}
}
}