溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

XML編程中的DOM4J是什么

發(fā)布時間:2020-07-21 14:14:08 來源:億速云 閱讀:444 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關(guān)XML編程中的DOM4J是什么,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

XML編程-DOM4J

基本概述

dom4j是一個JavaXML API,類似于jdom,用來讀寫XML文件的。dom4j是一個十分優(yōu)秀的JavaXML API,具有性能優(yōu)異、功能強大和極其易使用的特點,同時它也是一個開放源代碼的軟件,可以在SourceForge上找到它。在IBM developerWorks上面還可以找到一篇文章,對主流的Java XML API進行的性能、功能和易用性的評測,所以可以知道dom4j無論在哪個方面都是非常出色的。如今可以看到越來越多的Java軟件都在使用dom4j來讀寫XML,特別值得一提的是連SunJAXM也在用dom4j。這已經(jīng)是必須使用的jar包, Hibernate也用它來讀寫配置文件。

PSDOM4J功能那么強大的原因之一就是它支持XPath技術(shù),DOM4J也有相應(yīng)的參考文檔,需要的可以自行搜索下載。

為什么會有DOM4J?

之前,博客里闡述的兩門技術(shù),DOMSAX技術(shù),前者的缺點是耗費內(nèi)存,后者的缺點是只能進行讀取操作,而DOM4J既可以提交效率,也可以進行crud操作。

PS:使用DOM4J需要導(dǎo)入相應(yīng)基本JAR包,如果使用DOM4J的擴展功能,還需要導(dǎo)入擴展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.主動創(chuàng)建document對象
    Document document = DocumentHelper.createDocument();
    //創(chuàng)建根節(jié)點
    Element root = document.addElement("members");

PS:注意要導(dǎo)入相應(yīng)JAR包。

節(jié)點對象

1、獲取文檔的根節(jié)點
    Element root = document.getRootElement();
2、取得某個節(jié)點的子節(jié)點
    Element element=node.element(“書名");
3、取得節(jié)點的內(nèi)容
    String text1=node.getText();
    String text2=node.getTextTrim();	// 去掉內(nèi)容前面和后面的空格
4、取得某節(jié)點下所有名為“member”的子節(jié)點,并進行遍歷
    List nodes = rootElm.elements("member");
    for (Iterator it = nodes.iterator(); it.hasNext();) {
          Element elm = (Element) it.next();
          // do something
    }
5、對某節(jié)點下的所有子節(jié)點進行遍歷
    for(Iterator it=root.elementIterator();it.hasNext();){
        Element element = (Element) it.next();
           // do something
      }
6、在某節(jié)點下添加子節(jié)點
    Element ageElm = newMemberElm.addElement("age");
7、設(shè)置節(jié)點文字
    element.setText("29");
8、刪除某節(jié)點
    //childElm是待刪除的節(jié)點,parentElm是其父節(jié)點
    parentElm.remove(childElm);
9、添加一個CDATA節(jié)點
    Element contentElm = infoElm.addElement("content");
    contentElm.addCDATA(diary.getContent());

PS:注意不能跨層訪問節(jié)點。

節(jié)點對象屬性

1、取得某節(jié)點下的某屬性
    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、遍歷某節(jié)點的所有屬性
     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、設(shè)置某節(jié)點的屬性和文字
    newMemberElm.addAttribute("name", "sitinspring");
6、設(shè)置屬性的文字
    Attribute attribute=root.attribute("name");
     attribute.setText("sitinspring");

在指定位置插入節(jié)點

1.得到插入位置的節(jié)點列表(list

2.調(diào)用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:出現(xiàn)亂碼的原因是因為輸出字符集不能識別中文,這樣可以通過OutputFormatsetEncoding方法設(shè)置為UTF-8,然后再使用XMLWriter這種形參的(OutputStream out, OutputFormat format) 構(gòu)造方構(gòu)造方法,就能解決亂碼問題了,至于為什么會用createPrettyPrint方法,是因為這樣做輸出的格式更符合人的閱讀習(xí)慣。

綜合案例

XML8.xml

<?xml version="1.0" encoding="utf-8"?>
<班級 班次="1班" 編號="C1">
	<學(xué)生 學(xué)號="n1" 性別="男" 授課方式="面授" 朋友="n2" 班級編號="C1">
		<名字>張三</名字>
		<年齡>20</年齡>
		<介紹>不錯</介紹>
	</學(xué)生>
	<學(xué)生 學(xué)號="n2" 性別="女" 授課方式="面授" 朋友="n1 n3" 班級編號="C1">
		<名字>李四</名字>
		<年齡>18</年齡>
		<介紹>很好</介紹>
	</學(xué)生>
	<學(xué)生 學(xué)號="n3" 性別="男" 授課方式="面授" 朋友="n2" 班級編號="C1">
		<名字>王五</名字>
		<年齡>22</年齡>
		<介紹>非常好</介紹>
	</學(xué)生>
	<學(xué)生 性別="男" 班級編號="C1">
		<名字>小明</名字>
		<年齡>30</年齡>
		<介紹>好</介紹>
	</學(xué)生>
</班級>
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 {
		// 得到所有學(xué)生
		List<Element> students = document.getRootElement().elements("學(xué)生");
		for (Element e : students) {
			// 修改班級編號
			e.addAttribute("班級編號", "C2");
		}
		updateToXML(document);
	}

	// 更新元素(將所有學(xué)生的年齡+3)
	public static void updateElement(Document document) throws Exception {
		// 得到所有學(xué)生
		List<Element> students = document.getRootElement().elements("學(xué)生");
		for (Element e : students) {
			// 取出年齡
			Element age = e.element("年齡");
			age.setText(Integer.parseInt(age.getTextTrim()) + 3 + "");
		}
		updateToXML(document);
	}

	// 刪除元素(刪除第一個學(xué)生)
	public static void delete(Document document) throws Exception {
		// 找到元素
		Element stu = document.getRootElement().element("學(xué)生");
		// 刪除
		stu.getParent().remove(stu);

		// 更新
		updateToXML(document);
	}

	// 添加元素到指定位置
	public static void addByIndex(Document document, int index)
			throws Exception {
		// 創(chuàng)建一個元素
		Element newStu = DocumentHelper.createElement("學(xué)生");
		newStu.setText("小花");
		// 得到所有學(xué)生的list
		List<Element> students = document.getRootElement().elements("學(xué)生");
		// 按索引添加
		students.add(index, newStu);

		// 更新
		updateToXML(document);
	}

	// 添加元素(添加一個學(xué)生到xml中)
	public static void add(Document document) throws Exception {
		// 創(chuàng)建一個學(xué)生節(jié)點對象

		Element newStu = DocumentHelper.createElement("學(xué)生");
		// 給元素添加屬性
		newStu.addAttribute("學(xué)號", "n4");
		Element newStuName = DocumentHelper.createElement("名字");
		Element newStuAge = DocumentHelper.createElement("年齡");
		Element newStuIntro = DocumentHelper.createElement("介紹");

		// 把子元素掛載到學(xué)生節(jié)點下
		newStu.add(newStuName);
		newStu.add(newStuAge);
		newStu.add(newStuIntro);
		// 將學(xué)生掛載在根節(jié)點下
		document.getRootElement().add(newStu);

		// 更新
		updateToXML(document);
	}

	private static void updateToXML(Document document)
			throws UnsupportedEncodingException, FileNotFoundException,
			IOException {
		// 更新xml文件
		// 直接輸出會出現(xiàn)中文亂碼
		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技術(shù),跨層讀取某個元素
	public static void readByXPath(Document document) throws Exception {
		// 取出第一個學(xué)生
		Element student = (Element) document.selectSingleNode("/班級/學(xué)生[1]");
		System.out.println("姓名:" + student.elementText("名字") + "\t年齡:"
				+ student.elementText("年齡") + "\t介紹:"
				+ student.elementText("介紹") + "\t性別:"
				+ student.attributeValue("性別"));
	}

	// 讀取指定的某個元素(讀取第一個學(xué)生的信息)
	public static void read(Document document) throws Exception {
		// 得到根元素
		Element root = document.getRootElement();
		// root.elements("學(xué)生"); 取出root元素下的所有學(xué)生元素
		// root.element("學(xué)生"); 取出root元素下的第一個學(xué)生元素
		// 取出root元素下的第一個學(xué)生元素
		Element student = (Element) root.elements("學(xué)生").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元素內(nèi)容:"
				+ element.getTextTrim());

		Iterator<Element> iterator = element.elementIterator();

		while (iterator.hasNext()) {
			Element e = iterator.next();
			// 遞歸
			list(e);
		}
	}
}

以上就是XML編程中的DOM4J是什么,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI