一、XML
XML(Extensible Markup Language),可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言。
格式:
<?xml version="1.0" encoding="UTF-8"?> <users> <user id="1"> <username>Wayne</username> <password>123</password> </user> <user id="2"> <username>Edwin</username> <password>234</password> </user> </users>
二、DOM4J
DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和易用的特点,同时它也是一个开放源代码的软件,Java中生成和解析XML文档常常使用DOM4J。
1. 从XML读数据
// 获取 xml 包中的 users.xml SAXReader reader = new SAXReader(); Document doc = reader.read(类名.class.getClassLoader().getResource("xml/users.xml")); // 获取根元素 Element root = doc.getRootElement();
PS:
获取类路径下的文件可以通过 “类名.class.getClassLoader().getResource(文件名);” 或 “类名.class.getClassLoader().getResourceAsStream(文件名);”实现。
区别是 getResource 获取文件的绝对URL,getResourceAsStream 返回 InputStream。
// 获取根元素的所有名为“user”的子节点 List<Element> elements = root.elements("user");
// attributeValue("id") - 获取属性为id的值 /**elementText(子节点名) - 获取某个子节点中的文本值 (不包括节点,若只有节点,则返回一组空字符串)**/ for (Element e : elements) { System.out.println("[" + e.attributeValue("id") + "] " + e.elementText("username") + " - " + e.elementText("password")); }
使用XPath表达式获取节点元素(一般用于指定条件查询)
/* 相对路径查找,从当前节点查找子节点book */ List<Element> elements = root.selectNodes("book"); /* 绝对路径查找 */ List<Element> elements = root.selectNodes("/books/book/title"); /* 遍历所有满足要求的节点 */ List<Element> elements = root.selectNodes("//book"); /* 使用 [] 填写筛选子节点的条件判断 */ List<Element> elements = root.selectNodes("/books/book[author='Wayne']"); /* 筛选属性时要加 @ */ List<Element> elements = root.selectNodes("/books/book[@id >= 2]/title"); /* 筛选条件可使用 contains 函数,and 操作符等 */ List<Element> elements = root.selectNodes("/books/book[contains(title,'Java') and price > 80]/price");
2. 向XML写数据
向XML中写入对象代码:
// 将 List<Person> 写入 XML private static void writePersons2XML(List<Person> persons) { XMLWriter out = null; try { // 写数据首先创建 Document 对象 Document d = DocumentHelper.createDocument(); Element root = null, e_person = null; if ((root = d.getRootElement()) == null) { root = d.addElement("persons"); } for (Person p : persons) { e_person = root.addElement("person"); e_person.addAttribute("age", String.valueOf(p.getAge())); e_person.addElement("name").addText(p.getName()); e_person.addElement("sex").addText(p.getSex()); e_person.addElement("idcard").addText(p.getIdcard()); } String path = WriteToXML.class.getClassLoader().getResource("xml/persons.xml").getPath(); // out.write(d)只会写入/bin/目录下的xml,而不会写入/src/下。src下改变则bin改变,但bin改变src不会改变。所以学习时通过这种暴力方法写入src的xml path = path.replace("bin", "src"); out = new XMLWriter(new FileWriter(path), OutputFormat.createPrettyPrint()); out.write(d); } catch (IOException e) { e.printStackTrace(); } finally { try { if (out != null) out.close(); } catch (IOException e) { e.printStackTrace(); } } }