首先为什么会有Dom4j呢?
因为DOM太耗内存,而SAX只能对XML进行读取,而不能去添加、删除等。所以出现了Dom4j,它的效率更高,同时也可以进行crud操作。
1.DOM4J介绍
Dom4j是一个简单、灵活地开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。
Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括Sun公司自己的JAXP也用了Dom4j。
使用Dom4j开发,需下载dom4j相应的jar文件,并导入到项目。下载地址dom4j下载
2.DOM4J案例
依然使用我们之前的XML文件:
<?xml version="1.0" encoding="utf-8" standalone="no"?><班级> <学生 地址="香港"> <名字>周小星</名字> <年龄>23</年龄> <介绍>学习刻苦</介绍> </学生> <学生 地址="澳门"> <名字>林晓</名字> <年龄>25</年龄> <介绍>是一个好学生</介绍> </学生></班级>
该文档放在com.dom4j.test
包中。
使用DOM4J也要获取代表整个文档Document
对象,不过这个Document对象是org.dom4j
包中的。
在主方法中获取Document对象如下:
// 1.得到一个解析器SAXReader saxReader = new SAXReader(); // 2.指定解析哪个XML文件Document document = saxReader.read(new File("src/com/dom4j/test/myClass.xml"));
然后我们就可以根据需求来写相应的方法,在主方法中调用。
【1】指定读取某个元素(读取第一个学生的信息)
public static void read(Document document) { // 得到根元素 Element root = document.getRootElement(); // root.elements("学生"):表示取出root下的所有学生元素 // root.element("学生"):表示取出root下的第一个学生元素 Element student = root.element("学生"); // 取出属性 String address = student.attributeValue("地址"); // 取出各个子节点的值 String name = student.element("名字").getText(); String age = student.element("年龄").getText(); String intro = student.element("介绍").getText(); System.out.println(address); System.out.println(name); System.out.println(age); System.out.println(intro); }
【2】添加元素:添加一个学生信息到XML文档中
public static void add(Document document) throws Exception { // 首先我们来创建一个学生节点对象 Element student = DocumentHelper.createElement("学生"); Element name = DocumentHelper.createElement("名字"); name.setText("小强"); Element age = DocumentHelper.createElement("年龄"); age.setText("22"); Element intro = DocumentHelper.createElement("介绍"); intro.setText("是一个三好学生"); // 把三个子元素加到student节点下 student.add(name); student.add(age); student.add(intro); // 为学生添加属性 student.addAttribute("地址", "大理"); // 将学生节点添加到根节点下 document.getRootElement().add(student); // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat OutputFormat output = OutputFormat.createPrettyPrint(); // 设置输出的编码为utf-8 output.setEncoding("utf-8"); // 这里一定要用FileOutputStream字节流输出,不能用FileWriter,否则还会有乱码 XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output); xmlWriter.write(document); xmlWriter.close(); }
添加学生到XML文档中,也需要在最后将内存中的Document对象写入相应的文件,不然所有的操作只是在内存中进行,并不会输出到文件中,这与DOM类似。
我们依然可以将这段更新的代码单独写成一个方法,如下:
public static void update(Document document) throws Exception { // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat OutputFormat output = OutputFormat.createPrettyPrint(); // 设置输出的编码为utf-8 output.setEncoding("utf-8"); XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output); xmlWriter.write(document); xmlWriter.close(); }
【3】添加一个元素到指定位置
public static void addByIndex(Document document) throws Exception { // 创建一个元素 Element newStu = DocumentHelper.createElement("学生"); newStu.setText("王小明"); // 得到所有学生的list List allStudent = document.getRootElement().elements("学生"); allStudent.add(1, newStu); update(document); }
这里其实是直接在得到的List
中添加,然后更新即可。这里的List
就是java.util
包中的List
【4】删除一个元素或者删除这个元素的属性
删除一个元素与DOM类似,都是通过相应的父节点删除该节点。比方说我们要删除第一个学生节点:
public static void delete(Document document) throws Exception { // 找到该元素 Element student = document.getRootElement().element("学生"); // 删除元素的某个属性 student.remove(student.attribute("地址")); // 通过父节点删除节点 student.getParent().remove(student); update(document); }
【5】更新元素
比如我们要把所有学生的年龄加1,并且将所有学生的地址属性改为美国:
public static void updateAgeAndAddress(Document document) throws Exception { Element root = document.getRootElement(); List<Element> list = root.elements(); for (Element element : list) { // 更新属性 element.addAttribute("地址", "美国"); // 更新年龄子节点的值 Element e_age = element.element("年龄"); int age = Integer.parseInt(e_age.getTextTrim()); e_age.setText(String.valueOf(age + 1)); } update(document); }
首先为什么会有Dom4j呢?
因为DOM太耗内存,而SAX只能对XML进行读取,而不能去添加、删除等。所以出现了Dom4j,它的效率更高,同时也可以进行crud操作。
1.DOM4J介绍
Dom4j是一个简单、灵活地开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。
Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括Sun公司自己的JAXP也用了Dom4j。
使用Dom4j开发,需下载dom4j相应的jar文件,并导入到项目。下载地址dom4j下载
2.DOM4J案例
依然使用我们之前的XML文件:
<?xml version="1.0" encoding="utf-8" standalone="no"?><班级> <学生 地址="香港"> <名字>周小星</名字> <年龄>23</年龄> <介绍>学习刻苦</介绍> </学生> <学生 地址="澳门"> <名字>林晓</名字> <年龄>25</年龄> <介绍>是一个好学生</介绍> </学生></班级>
该文档放在com.dom4j.test
包中。
使用DOM4J也要获取代表整个文档Document
对象,不过这个Document对象是org.dom4j
包中的。
在主方法中获取Document对象如下:
// 1.得到一个解析器SAXReader saxReader = new SAXReader(); // 2.指定解析哪个XML文件Document document = saxReader.read(new File("src/com/dom4j/test/myClass.xml"));
然后我们就可以根据需求来写相应的方法,在主方法中调用。
【1】指定读取某个元素(读取第一个学生的信息)
public static void read(Document document) { // 得到根元素 Element root = document.getRootElement(); // root.elements("学生"):表示取出root下的所有学生元素 // root.element("学生"):表示取出root下的第一个学生元素 Element student = root.element("学生"); // 取出属性 String address = student.attributeValue("地址"); // 取出各个子节点的值 String name = student.element("名字").getText(); String age = student.element("年龄").getText(); String intro = student.element("介绍").getText(); System.out.println(address); System.out.println(name); System.out.println(age); System.out.println(intro); }
【2】添加元素:添加一个学生信息到XML文档中
public static void add(Document document) throws Exception { // 首先我们来创建一个学生节点对象 Element student = DocumentHelper.createElement("学生"); Element name = DocumentHelper.createElement("名字"); name.setText("小强"); Element age = DocumentHelper.createElement("年龄"); age.setText("22"); Element intro = DocumentHelper.createElement("介绍"); intro.setText("是一个三好学生"); // 把三个子元素加到student节点下 student.add(name); student.add(age); student.add(intro); // 为学生添加属性 student.addAttribute("地址", "大理"); // 将学生节点添加到根节点下 document.getRootElement().add(student); // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat OutputFormat output = OutputFormat.createPrettyPrint(); // 设置输出的编码为utf-8 output.setEncoding("utf-8"); // 这里一定要用FileOutputStream字节流输出,不能用FileWriter,否则还会有乱码 XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output); xmlWriter.write(document); xmlWriter.close(); }
添加学生到XML文档中,也需要在最后将内存中的Document对象写入相应的文件,不然所有的操作只是在内存中进行,并不会输出到文件中,这与DOM类似。
我们依然可以将这段更新的代码单独写成一个方法,如下:
public static void update(Document document) throws Exception { // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat OutputFormat output = OutputFormat.createPrettyPrint(); // 设置输出的编码为utf-8 output.setEncoding("utf-8"); XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output); xmlWriter.write(document); xmlWriter.close(); }
【3】添加一个元素到指定位置
public static void addByIndex(Document document) throws Exception { // 创建一个元素 Element newStu = DocumentHelper.createElement("学生"); newStu.setText("王小明"); // 得到所有学生的list List allStudent = document.getRootElement().elements("学生"); allStudent.add(1, newStu); update(document); }
这里其实是直接在得到的List
中添加,然后更新即可。这里的List
就是java.util
包中的List
【4】删除一个元素或者删除这个元素的属性
删除一个元素与DOM类似,都是通过相应的父节点删除该节点。比方说我们要删除第一个学生节点:
public static void delete(Document document) throws Exception { // 找到该元素 Element student = document.getRootElement().element("学生"); // 删除元素的某个属性 student.remove(student.attribute("地址")); // 通过父节点删除节点 student.getParent().remove(student); update(document); }
【5】更新元素
比如我们要把所有学生的年龄加1,并且将所有学生的地址属性改为美国:
public static void updateAgeAndAddress(Document document) throws Exception { Element root = document.getRootElement(); List<Element> list = root.elements(); for (Element element : list) { // 更新属性 element.addAttribute("地址", "美国"); // 更新年龄子节点的值 Element e_age = element.element("年龄"); int age = Integer.parseInt(e_age.getTextTrim()); e_age.setText(String.valueOf(age + 1)); } update(document); }
以上就是XML—XML解析之DOM4J的内容,更多相关内容请关注PHP中文网(www.php.cn)!