簡單實體類別和xml檔案的相互轉換方法
下面我就為大家帶來一篇簡單實體類別和xml檔案的相互轉換方法。現在就分享給大家,也給大家做個參考。
最近寫一個題目,要求將一組員工實體類別轉換成xml文件,或將xml文件轉換成一組實體類別。題目不難,但寫完感覺可以利用泛型和反射將任意一個實體類別和xml檔案進行轉換。於是今天下午立刻動手
試了下,做了個簡單的模型,可以將簡單的實體類別和xml檔案進行相互轉換,但對實體類別的屬性類型有限制,目前只支援String, Integer, Double三種類型。但是後面可以擴充。
我的大概思路是這樣的,只要能拿到實體類別的類型信息,我就能拿到實體類別的全部欄位名稱和類型,拼屬性的set和get方法更是簡單明了,這時候只需要透過方法的反射,將xml檔的資料讀取出來給這個反射即可。
反過來只要給我一個任意對象,我就能透過反射拿到該對象所有欄位的值,這時候在寫xml檔即可。
具體程式碼如下:
package com.pcq.entity; import java.io.*; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class XMLAndEntityUtil { private static Document document = DocumentHelper.createDocument(); /** * 判断是否是个xml文件,目前类里尚未使用该方法 * @param filePath * @return */ @SuppressWarnings("unused") private static boolean isXMLFile(String filePath) { File file = new File(filePath); if(!file.exists() || filePath.indexOf(".xml") > -1) { return false; } return true; } /** * 将一组对象数据转换成XML文件 * @param list * @param filePath 存放的文件路径 */ public static <T> void writeXML(List<T> list, String filePath) { Class<?> c = list.get(0).getClass(); String root = c.getSimpleName().toLowerCase() + "s"; Element rootEle = document.addElement(root); for(Object obj : list) { try { Element e = writeXml(rootEle, obj); document.setRootElement(e); writeXml(document, filePath); } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } } } /** * 通过一个根节点来写对象的xml节点,这个方法不对外开放,主要给writeXML(List<T> list, String filePath)提供服务 * @param root * @param object * @return * @throws NoSuchMethodException * @throws SecurityException * @throws IllegalAccessException * @throws IllegalArgumentException * @throws InvocationTargetException */ private static Element writeXml(Element root, Object object) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Class<?> c = object.getClass(); String className = c.getSimpleName().toLowerCase(); Element ele = root.addElement(className); Field[] fields = c.getDeclaredFields(); for(Field f : fields) { String fieldName = f.getName(); String param = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); Element fieldElement = ele.addElement(fieldName); Method m = c.getMethod("get" + param, null); String s = ""; if(m.invoke(object, null) != null) { s = m.invoke(object, null).toString(); } fieldElement.setText(s); } return root; } /** * 默认使用utf-8 * @param c * @param filePath * @return * @throws UnsupportedEncodingException * @throws FileNotFoundException */ public static <T> List<T> getEntitys(Class<T> c, String filePath) throws UnsupportedEncodingException, FileNotFoundException { return getEntitys(c, filePath, "utf-8"); } /** * 将一个xml文件转变成实体类 * @param c * @param filePath * @return * @throws FileNotFoundException * @throws UnsupportedEncodingException */ public static <T> List<T> getEntitys(Class<T> c, String filePath, String encoding) throws UnsupportedEncodingException, FileNotFoundException { File file = new File(filePath); String labelName = c.getSimpleName().toLowerCase(); SAXReader reader = new SAXReader(); List<T> list = null; try { InputStreamReader in = new InputStreamReader(new FileInputStream(file), encoding); Document document = reader.read(in); Element root = document.getRootElement(); List elements = root.elements(labelName); list = new ArrayList<T>(); for(Iterator<Emp> it = elements.iterator(); it.hasNext();) { Element e = (Element)it.next(); T t = getEntity(c, e); list.add(t); } } catch (DocumentException e) { e.printStackTrace(); } catch (InstantiationException e1) { e1.printStackTrace(); } catch (IllegalAccessException e1) { e1.printStackTrace(); } catch (NoSuchMethodException e1) { e1.printStackTrace(); } catch (SecurityException e1) { e1.printStackTrace(); } catch (IllegalArgumentException e1) { e1.printStackTrace(); } catch (InvocationTargetException e1) { e1.printStackTrace(); } return list; } /** * 将一种类型 和对应的 xml元素节点传进来,返回该类型的对象,该方法不对外开放 * @param c 类类型 * @param ele 元素节点 * @return 该类型的对象 * @throws InstantiationException * @throws IllegalAccessException * @throws NoSuchMethodException * @throws SecurityException * @throws IllegalArgumentException * @throws InvocationTargetException */ @SuppressWarnings("unchecked") private static <T> T getEntity(Class<T> c, Element ele) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException { Field[] fields = c.getDeclaredFields(); Object object = c.newInstance();// for(Field f : fields) { String type = f.getType().toString();//获得字段的类型 String fieldName = f.getName();//获得字段名称 String param = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);//把字段的第一个字母变成大写 Element e = ele.element(fieldName); if(type.indexOf("Integer") > -1) {//说明该字段是Integer类型 Integer i = null; if(e.getTextTrim() != null && !e.getTextTrim().equals("")) { i = Integer.parseInt(e.getTextTrim()); } Method m = c.getMethod("set" + param, Integer.class); m.invoke(object, i);//通过反射给该字段set值 } if(type.indexOf("Double") > -1) { //说明该字段是Double类型 Double d = null; if(e.getTextTrim() != null && !e.getTextTrim().equals("")) { d = Double.parseDouble(e.getTextTrim()); } Method m = c.getMethod("set" + param, Double.class); m.invoke(object, d); } if(type.indexOf("String") > -1) {//说明该字段是String类型 String s = null; if(e.getTextTrim() != null && !e.getTextTrim().equals("")) { s = e.getTextTrim(); } Method m = c.getMethod("set" + param, String.class); m.invoke(object, s); } } return (T)object; } /** * 用来写xml文件 * @param doc Document对象 * @param filePath 生成的文件路径 * @param encoding 写xml文件的编码 */ public static void writeXml(Document doc, String filePath, String encoding) { XMLWriter writer = null; OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding(encoding);// 指定XML编码 try { writer = new XMLWriter(new FileWriter(filePath), format); writer.write(doc); } catch (IOException e) { e.printStackTrace(); } finally { try { writer.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 默认使用utf-8的格式写文件 * @param doc * @param filePath */ public static void writeXml(Document doc, String filePath) { writeXml(doc, filePath, "utf-8"); } }
假如有個實體類別是:
package com.pcq.entity; import java.io.Serializable; public class Emp implements Serializable{ private Integer id; private String name; private Integer deptNo; private Integer age; private String gender; private Integer bossId; private Double salary; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getDeptNo() { return deptNo; } public void setDeptNo(Integer deptNo) { this.deptNo = deptNo; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Integer getBossId() { return bossId; } public void setBossId(Integer bossId) { this.bossId = bossId; } public Double getSalary() { return salary; } public void setSalary(Double salary) { this.salary = salary; } }
<?xml version="1.0" encoding="utf-8"?> <emps> <emp> <id>1</id> <name>张三</name> <deptNo>50</deptNo> <age>25</age> <gender>男</gender> <bossId>6</bossId> <salary>9000.0</salary> </emp> <emp> <id>2</id> <name>李四</name> <deptNo>50</deptNo> <age>22</age> <gender>女</gender> <bossId>6</bossId> <salary>8000.0</salary> </emp> </emps>
package com.pcq.entity; public class Student { private Integer id; private String name; private Integer age; private String gender; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } }
<?xml version="1.0" encoding="utf-8"?> <students> <student> <id></id> <name>pcq</name> <age>18</age> <gender>男</gender> </student> </students>
AjaxFileUpload Struts2實作多檔案上傳功能
##
以上是簡單實體類別和xml檔案的相互轉換方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

開啟微信,在我中選擇設置,選擇通用後選擇儲存空間,在儲存空間選擇管理,選擇要恢復檔案的對話選擇感嘆號圖示。教學適用型號:iPhone13系統:iOS15.3版本:微信8.0.24解析1先開啟微信,在我的頁面中點選設定選項。 2接著在設定頁面中找到並點選通用選項。 3然後在通用頁面中點選儲存空間。 4接下來在儲存空間頁面中點選管理。 5最後選擇要恢復檔案的對話,點選右側的感嘆號圖示。補充:微信文件一般幾天過期1要是微信接收的文件並沒有點開過的情況下,那在七十二鐘頭之後微信系統會清除掉,要是己經查看了微信

在Windows系統中,照片應用程式是一個方便的方式來檢視和管理照片和影片。透過這個應用程序,用戶可以輕鬆存取他們的多媒體文件,而無需安裝額外的軟體。然而,有時用戶可能會碰到一些問題,例如在使用照片應用程式時遇到「無法開啟此文件,因為不支援該格式」的錯誤提示,或在嘗試開啟照片或影片時出現文件損壞的問題。這種情況可能會讓使用者感到困惑和不便,需要進行一些調查和修復來解決這些問題。當用戶嘗試在Photos應用程式上開啟照片或影片時,會看到以下錯誤。抱歉,照片無法開啟此文件,因為目前不支援該格式,或該文件

在本文中,我們將介紹如何解決在Windows系統中刪除檔案或資料夾時出現「準備刪除」提示的問題。這個提示意味著系統正在進行一些背景操作,例如檢查檔案權限、驗證檔案是否被其他程式佔用、計算要刪除項目的大小等。我們將為您提供一些解決方法,以確保您能夠順利刪除文件,而無需等待太長時間。為什麼Windows要花這麼長時間才能刪除檔案? Windows準備刪除檔案所需的時間受多種因素影響,包括檔案大小、儲存裝置速度和後台進程。長時間或被卡住的「正在準備刪除」提示可能暗示系統資源不足、磁碟錯誤或檔案系統問題。在

Tmp格式檔案是一種暫存檔案格式,通常由電腦系統或程式在執行過程中產生。這些文件的目的是儲存臨時數據,以幫助程式正常運行或提高效能。一旦程式執行完成或電腦重啟,這些tmp檔案往往就沒有了存在的必要性。所以,對於Tmp格式檔案來說,它們本質上是可以刪除的。而且,刪除這些tmp檔案能夠釋放硬碟空間,確保電腦的正常運作。但是,在刪除Tmp格式檔案之前,我們需

gho檔案是一種GhostImage影像文件,它通常用於將整個硬碟或分割區的資料備份成一個檔案。在一些特定的情況下,我們需要將這種gho檔案重新安裝回硬碟上,以還原硬碟或分割區到先前的狀態。下面將介紹gho檔案的安裝方法。首先,在安裝之前,我們需要準備以下工具和材料:實體的gho文件:確保你擁有一份完整的gho文件,它通常以.gho為後綴名,並且包含有備份

在電腦中刪除或解壓縮資料夾,時有時會彈出提示對話框“錯誤0x80004005:未指定錯誤”,如果遇到這中情況應該怎麼解決呢?提示錯誤碼0x80004005的原因其實很多,但大部分因為病毒導致,我們可以重新註冊dll來解決問題,下面,小編給大夥講解0x80004005錯誤代碼處理經驗。有使用者在使用電腦時出現錯誤代碼0X80004005的提示,0x80004005錯誤主要是由於電腦沒有正確註冊某些動態連結庫文件,或電腦與Internet之間存在不允許的HTTPS連接防火牆所引起。那麼如何

檔案路徑是作業系統中用於識別和定位檔案或資料夾的字串。在檔案路徑中,常見的有兩種符號分隔路徑,即正斜線(/)和反斜線()。這兩個符號在不同的作業系統中有不同的使用方式和意義。正斜線(/)是Unix和Linux系統中常用的路徑分隔符號。在這些系統中,檔案路徑是以根目錄(/)為起始點,每個目錄之間使用正斜線進行分隔。例如,路徑/home/user/Docume

夸克網盤和百度網盤都是現在最常用的儲存文件的網盤軟體,如果想要將夸克網盤內的文件保存到百度網盤,要怎麼操作呢?本期小編整理了夸克網盤電腦端的檔案轉移到百度網盤的教學步驟,一起來看看是怎麼操作吧。 夸克網盤的檔案怎麼存到百度網盤?要將夸克網盤的文件轉移到百度網盤,首先需在夸克網盤下載所需文件,然後在百度網盤用戶端中選擇目標資料夾並開啟。接著,將夸克網盤中下載的檔案拖放到百度網盤用戶端開啟的資料夾中,或使用上傳功能將檔案新增至百度網盤。確保上傳完成後在百度網盤中查看檔案是否已成功轉移。這樣就
