个人随笔
目录
工具类:Java用XML模仿表的增删改查
2020-09-22 22:48:38

有时候,我们不一定需要用数据库来保存信息,可以直接用文件来保存,比如这里把文件夹当作表名,把文件当作记录,工具类如下:

  1. /**
  2. * XML操作工具类,保存的时候进行类编码,查询的时候已经进行解码
  3. * @author forever
  4. *
  5. */
  6. public class XMLUtils {
  7. /**
  8. * 添加xml节点
  9. * @param parent 父节点
  10. * @param elementName 节点名称
  11. * @param elementValue 节点值
  12. * @return 返回新添加的节点
  13. */
  14. private static Element addElement(Element parent, String elementName, String elementValue) {
  15. Element element = parent.addElement(elementName);
  16. if (!"".equals(elementValue)) {
  17. element.setText(elementValue);
  18. }
  19. return element;
  20. }
  21. // 写入XML文件
  22. /**
  23. * Dom4j通过XMLWriter将Document对象表示的XML树写入指定的文件,并使用OutputFormat格式对象指定写入的风格和编码方法。
  24. * 调用OutputFormat.createPrettyPrint()方法可以获得一个默认的pretty print风格的格式对象。
  25. * 对OutputFormat对象调用setEncoding()方法可以指定XML文件的编码方法。
  26. * @param document
  27. * @param filename
  28. * @return
  29. */
  30. private static boolean saveXmlFile(Document document, String xmlPath) {
  31. boolean flag = true;
  32. try {
  33. // OutputFormat.createPrettyPrint() : 表示格式化(就是有缩进的格式)
  34. //但是这种格式化会导致换行不见了
  35. OutputFormat format = new OutputFormat();
  36. XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(xmlPath), "UTF-8"), format);
  37. writer.setEscapeText(false);
  38. writer.write(document);
  39. writer.close();
  40. System.out.print("保存XML文件成功:"+xmlPath);
  41. } catch (Exception ex) {
  42. flag = false;
  43. ex.printStackTrace();
  44. System.out.print("保存XML文件失败:"+xmlPath);
  45. }
  46. return flag;
  47. }
  48. // 读取XML文档
  49. private static Document load(String xmlPath) {
  50. Document document = null;
  51. try {
  52. SAXReader saxReader = new SAXReader();
  53. document = saxReader.read(new File(xmlPath)); // 读取XML文件,获得document对象
  54. } catch (Exception ex) {
  55. ex.printStackTrace();
  56. }
  57. return document;
  58. }
  59. /**
  60. * 保存,这里需要指定保存的对象和文件所在路径
  61. * @param object
  62. * @param xmlPath
  63. */
  64. public static Boolean save(Object object,String xmlPath) {
  65. try {
  66. SAXReader saxReader = new SAXReader();
  67. Document document = saxReader.getDocumentFactory().createDocument();
  68. Class<?> clazz = object.getClass();
  69. String rootName = clazz.getSimpleName().toLowerCase();
  70. Element root = document.addElement(rootName+"s");
  71. Element content = addElement(root, rootName, "");
  72. for (Field declaredField : clazz.getDeclaredFields()) {
  73. declaredField.setAccessible(true);
  74. //获取属性名字
  75. String name = declaredField.getName();
  76. //获取属性值
  77. String value = (String) declaredField.get(object);
  78. if(value==null) {
  79. value="";
  80. }
  81. addElement(content, name,encode(value));
  82. }
  83. File file = new File(xmlPath);
  84. file.createNewFile();
  85. return saveXmlFile(document, xmlPath);
  86. } catch (Exception e) {
  87. e.printStackTrace();
  88. }
  89. return false;
  90. }
  91. /**
  92. * 删除xml
  93. * @param xmlPath xml路径
  94. */
  95. public static Boolean delete(String xmlPath) {
  96. try {
  97. File file = new File(xmlPath);
  98. file.delete();
  99. System.out.print("删除xml文件成");
  100. return true;
  101. } catch (Exception e) {
  102. e.printStackTrace();
  103. }
  104. return false;
  105. }
  106. /**
  107. * xml更新 其实内部只有一条记录
  108. * @param object 要更新的对象
  109. * @param xmlPath 路径
  110. * @return
  111. */
  112. public static boolean update(Object object, String xmlPath) {
  113. try {
  114. Class<?> clazz = object.getClass();
  115. Document document = load(xmlPath);
  116. if (document == null) {
  117. return false;
  118. }
  119. Element root = document.getRootElement();
  120. List<Element> list = root.elements();
  121. for (Element p : list) {
  122. // 获取每个p元素中的name元素
  123. // 这里就找到了要修改的元素
  124. for (Field declaredField : clazz.getDeclaredFields()) {
  125. declaredField.setAccessible(true);
  126. String name = declaredField.getName();
  127. String value = (String) declaredField.get(object);
  128. if (value == null) {
  129. value = "";
  130. }
  131. List<Element> childs = p.elements();
  132. for (Element p2 : childs) {
  133. if (p2.getName().equals(name)) {
  134. p2.setText(encode(value));
  135. break;
  136. }
  137. }
  138. }
  139. }
  140. return saveXmlFile(document, xmlPath);
  141. } catch (Exception e) {
  142. e.printStackTrace();
  143. }
  144. return false;
  145. }
  146. /**
  147. * 查询内容
  148. * @param clazz
  149. * @param xmlPath
  150. * @return
  151. */
  152. public static <T> T select(Class<T> clazz, String xmlPath) {
  153. try {
  154. Document document = load(xmlPath);
  155. if (document == null) {
  156. return null;
  157. }
  158. Element root = document.getRootElement();
  159. T obj = clazz.newInstance();
  160. List<Element> list = root.elements();
  161. // 遍历p元素
  162. for (Element p : list) {
  163. // 获取每个p元素中的name元素
  164. for (Field declaredField : clazz.getDeclaredFields()) {
  165. declaredField.setAccessible(true);
  166. String name = declaredField.getName();
  167. List<Element> childs = p.elements();
  168. for (Element p2 : childs) {
  169. if (p2.getName().equals(name)) {
  170. Class<?> z = declaredField.getType();
  171. String value = (String) p2.getData();
  172. if(value==null) {
  173. value="";
  174. }
  175. declaredField.set(obj,decode(value));
  176. break;
  177. }
  178. }
  179. }
  180. }
  181. return obj;
  182. } catch (Exception e) {
  183. e.printStackTrace();
  184. }
  185. return null;
  186. }
  187. public static String encode(String str) {
  188. String content ="";
  189. if(StringUtils.isNotBlank(str)) {
  190. try {
  191. content =str;
  192. } catch (Exception e) {
  193. // TODO Auto-generated catch block
  194. e.printStackTrace();
  195. }
  196. }
  197. return content;
  198. }
  199. public static String decode(String str) {
  200. String content ="";
  201. if(StringUtils.isNotBlank(str)) {
  202. try {
  203. content = str;
  204. return content;
  205. } catch (Exception e) {
  206. // TODO Auto-generated catch block
  207. e.printStackTrace();
  208. }
  209. }
  210. return content;
  211. }
  212. public static void main(String[] args) throws UnsupportedEncodingException {
  213. //String xmlPath = "E:/data/table/menus/";
  214. //String id = SnowflakeIdUtil.getSnowflakeId()+"";
  215. //xmlPath = xmlPath+id+".xml";
  216. //Menu menu = new Menu();
  217. //menu.setId(id);
  218. //menu.setImgurl("");
  219. //menu.setName("菜"+id);
  220. //menu.setParent_id("0");
  221. //menu.setSort("1");
  222. //XMLUtils.save(menu, xmlPath);
  223. //XMLUtils.update(menu, xmlPath);
  224. //XMLUtils.delete(xmlPath);
  225. //Menu m = XMLUtils.select(Menu.class, xmlPath);
  226. }
  227. }

需要注意的是,再保存数据的时候可能需要对文件进行转码或者用xml规定的字符包起来。

 553

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2