XML编程-DOM4J
基础概述
dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个异常优秀的JavaXML API,具有机能优秀、功用壮大和极为易运用的特性,同时它也是一个开放源代码的软件,能够在SourceForge上找到它。在IBM developerWorks上面还能够找到一篇文章,对主流的Java XML API举行的机能、功用和易用性的评测,所以能够晓得dom4j不管在哪一个方面都是异常精彩的。现在能够看到越来越多的Java软件都在运用dom4j来读写XML,迥殊值得一提的是连Sun的JAXM也在用dom4j。这已经是必需运用的jar包, Hibernate也用它来读写配置文件。
PS:DOM4J功用那末壮大的缘由之一就是它支撑XPath手艺,DOM4J也有响应的参考文档,须要的能够自行搜刮下载。
为何会有DOM4J?
之前,博客里论述的两门手艺,DOM和SAX手艺,前者的瑕玷是消耗内存,后者的瑕玷是只能举行读取操纵,而DOM4J既能够提交效力,也能够举行crud操纵。
PS:运用DOM4J须要导入响应基础JAR包,假如运用DOM4J的扩大功用,还须要导入扩大JAR包。
DOM4J运用入门
DOM4J获得Document对象的三种要领
1.读取XML文件,获得document对象(经常使用)
SAXReader reader = new SAXReader(); Document document = reader.read(new File(“src/input.xml"));
2.剖析XML情势的文本,获得document对象
String text = "<members></members>"; Document document = DocumentHelper.parseText(text);
3.主动建立document对象
Document document = DocumentHelper.createDocument(); //建立根节点 Element root = document.addElement("members");
PS:注重要导入响应JAR包。
节点对象
1、猎取文档的根节点
Element root = document.getRootElement();
2、获得某个节点的子节点
Element element=node.element(“书名");
3、获得节点的内容
String text1=node.getText(); String text2=node.getTextTrim(); // 去掉内容前面和背面的空格
4、获得某节点下一切名为“member”的子节点,并举行遍历
List nodes = rootElm.elements("member"); for (Iterator it = nodes.iterator(); it.hasNext();) { Element elm = (Element) it.next(); // do something }
5、对某节点下的一切子节点举行遍历
for(Iterator it=root.elementIterator();it.hasNext();){ Element element = (Element) it.next(); // do something }
6、在某节点下增加子节点
Element ageElm = newMemberElm.addElement("age");
7、设置节点笔墨
element.setText("29");
8、删除某节点
//childElm是待删除的节点,parentElm是其父节点 parentElm.remove(childElm);
9、增加一个CDATA节点
Element contentElm = infoElm.addElement("content"); contentElm.addCDATA(diary.getContent());
PS:注重不能跨层接见节点。
节点对象属性
1、获得某节点下的某属性
Element root=document.getRootElement(); //属性名name Attribute attribute=root.attribute("size");
2、获得属性的笔墨
String text=attribute.getText();
3、删除某属性
Attribute attribute=root.attribute("size"); root.remove(attribute);
4、遍历某节点的一切属性
Element root=document.getRootElement(); for(Iterator it=root.attributeIterator();it.hasNext();){ Attribute attribute = (Attribute) it.next(); String text=attribute.getText(); System.out.println(text); }
5、设置某节点的属性和笔墨
newMemberElm.addAttribute("name", "sitinspring");
6、设置属性的笔墨
Attribute attribute=root.attribute("name"); attribute.setText("sitinspring");
在指定位置插进去节点
1.获得插进去位置的节点列表(list)
2.挪用list.add(index,elemnent),由index决议element的插进去位置。
Element元素能够经由过程DocumentHelper对象获得。示例代码:
Element aaa = DocumentHelper.createElement("aaa"); aaa.setText("aaa"); List list = root.element("书").elements(); list.add(1, aaa); //更新document
将文档写入XML文件
1、假如文档是全英文
XMLWriter writer = new XMLWriter(new FileWriter("output.xml")); writer.write(document); writer.close();
2、假如文档含有中文
OutputFormat outputFormat = OutputFormat.createPrettyPrint(); outputFormat.setEncoding("utf-8"); XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/pc/XML8.xml"), outputFormat); xmlWriter.write(document); xmlWriter.close();
PS:涌现乱码的缘由是因为输出字符集不能辨认中文,如许能够经由过程OutputFormat的setEncoding要领设置为”UTF-8”,然后再运用XMLWriter这类形参的(OutputStream out, OutputFormat format) 组织方组织要领,就可以处理乱码问题了,至于为何会用createPrettyPrint要领,是因为如许做输出的花样更相符人的浏览习气。
综合案例
XML8.xml
<?xml version="1.0" encoding="utf-8"?> <班级 班次="1班" 编号="C1"> <门生 学号="n1" 性别="男" 讲课体式格局="面授" 朋侪="n2" 班级编号="C1"> <名字>张三</名字> <岁数>20</岁数> <引见>不错</引见> </门生> <门生 学号="n2" 性别="女" 讲课体式格局="面授" 朋侪="n1 n3" 班级编号="C1"> <名字>李四</名字> <岁数>18</岁数> <引见>很好</引见> </门生> <门生 学号="n3" 性别="男" 讲课体式格局="面授" 朋侪="n2" 班级编号="C1"> <名字>王五</名字> <岁数>22</岁数> <引见>异常好</引见> </门生> <门生 性别="男" 班级编号="C1"> <名字>小明</名字> <岁数>30</岁数> <引见>好</引见> </门生> </班级>
package com.pc; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.UnsupportedEncodingException; 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; /** * * @author Switch * @function 运用DOM4j剖析XML文件 * */ public class XML8 { // 运用DOM4j对XML举行CRUD操纵 public static void main(String[] args) throws Exception { // 1.获得剖析器 SAXReader saxReader = new SAXReader(); // 2.指定剖析哪一个XML文件 Document document = saxReader.read(new File("src/com/pc/XML8.xml")); // list(document.getRootElement()); // read(document); // readByXPath(document); // add(document); // delete(document); // updateElement(document); // updateAttribute(document); // addByIndex(document, 3); } // 更新属性(修正一切班级编号为C2) public static void updateAttribute(Document document) throws Exception { // 获得一切门生 List<Element> students = document.getRootElement().elements("门生"); for (Element e : students) { // 修正班级编号 e.addAttribute("班级编号", "C2"); } updateToXML(document); } // 更新元素(将一切门生的岁数+3) public static void updateElement(Document document) throws Exception { // 获得一切门生 List<Element> students = document.getRootElement().elements("门生"); for (Element e : students) { // 掏出岁数 Element age = e.element("岁数"); age.setText(Integer.parseInt(age.getTextTrim()) + 3 + ""); } updateToXML(document); } // 删除元素(删除第一个门生) public static void delete(Document document) throws Exception { // 找到元素 Element stu = document.getRootElement().element("门生"); // 删除 stu.getParent().remove(stu); // 更新 updateToXML(document); } // 增加元素到指定位置 public static void addByIndex(Document document, int index) throws Exception { // 建立一个元素 Element newStu = DocumentHelper.createElement("门生"); newStu.setText("小花"); // 获得一切门生的list List<Element> students = document.getRootElement().elements("门生"); // 按索引增加 students.add(index, newStu); // 更新 updateToXML(document); } // 增加元素(增加一个门生到xml中) public static void add(Document document) throws Exception { // 建立一个门生节点对象 Element newStu = DocumentHelper.createElement("门生"); // 给元素增加属性 newStu.addAttribute("学号", "n4"); Element newStuName = DocumentHelper.createElement("名字"); Element newStuAge = DocumentHelper.createElement("岁数"); Element newStuIntro = DocumentHelper.createElement("引见"); // 把子元素挂载到门生节点下 newStu.add(newStuName); newStu.add(newStuAge); newStu.add(newStuIntro); // 将门生挂载在根节点下 document.getRootElement().add(newStu); // 更新 updateToXML(document); } private static void updateToXML(Document document) throws UnsupportedEncodingException, FileNotFoundException, IOException { // 更新xml文件 // 直接输出会涌现中文乱码 OutputFormat outputFormat = OutputFormat.createPrettyPrint(); outputFormat.setEncoding("utf-8"); XMLWriter xmlWriter = new XMLWriter(new FileOutputStream( "src/com/pc/XML8.xml"), outputFormat); xmlWriter.write(document); xmlWriter.close(); } // xpath手艺,跨层读取某个元素 public static void readByXPath(Document document) throws Exception { // 掏出第一个门生 Element student = (Element) document.selectSingleNode("/班级/门生[1]"); System.out.println("姓名:" + student.elementText("名字") + "\t岁数:" + student.elementText("岁数") + "\t引见:" + student.elementText("引见") + "\t性别:" + student.attributeValue("性别")); } // 读取指定的某个元素(读取第一个门生的信息) public static void read(Document document) throws Exception { // 获得根元素 Element root = document.getRootElement(); // root.elements("门生"); 掏出root元素下的一切门生元素 // root.element("门生"); 掏出root元素下的第一个门生元素 // 掏出root元素下的第一个门生元素 Element student = (Element) root.elements("门生").get(0); System.out.println("姓名:" + student.elementText("名字") + "\t岁数:" + student.elementText("岁数") + "\t引见:" + student.elementText("引见") + "\t性别:" + student.attributeValue("性别")); } // 遍历xml文件 public static void list(Element element) { System.out.println("元素称号:" + element.getName() + "\t元素内容:" + element.getTextTrim()); Iterator<Element> iterator = element.elementIterator(); while (iterator.hasNext()) { Element e = iterator.next(); // 递归 list(e); } } }
以上就是XML编程-DOM4J的内容,更多相关内容请关注ki4网(www.ki4.cn)!