XML文檔解析:dom4j對xml文檔進行解析

dom4j的概述

介紹(來自百度百科):

dom4j是一個Java的XML API,是jdom的升級品,用來讀寫XML文件的。dom4j是一個十分優秀的JavaXML API,具有性能優異、功能強大和極其易使用的特點,它的性能超過sun公司官方的dom技術,同時它也是一個開放源代碼的軟件,可以在SourceForge上找到它。在IBM developerWorks上面還可以找到一篇文章,對主流的Java XML API進行的性能、功能和易用性的評測,所以可以知道dom4j無論在哪個方面都是非常出色的。如今可以看到越來越多的Java軟件都在使用dom4j來讀寫XML,特別值得一提的是連Sun的JAXM也在用dom4j。這已經是必須使用的jar包, Hibernate也用它來讀寫配置文件。

DOM4J常用的類:

  • Document : 表示整個XML文檔。文檔Document對象是通常被稱爲DOM樹。
  • Element : 表示一個XML元素。 Element對象有方法來操作其子元素,它的文本,屬性和名稱空間。
  • Attribute : 表示元素的屬性。屬性有方法來獲取和設置屬性的值。它有父節點和屬性類型。
  • Node : 代表元素,屬性或處理指令

dom4j常用的方法:

  • SAXReader.read(xmlSource)():構建XML源的DOM4J文檔。
  • Document.getRootElement():得到的XML的根元素。
  • Document.setXMLEncoding​():設置此文檔的編碼,因爲它將出現在文檔的XML聲明部分中。
  • Element.element(Element):獲得指定元素。
  • Element.attributeValue(Attribute):獲取指定的屬性值。
  • Element.addAttributes() - 設置修改屬性值。
  • Element.node(index) - 獲得在元素特定索引XML節點。
  • Element.attributes() - 獲取一個元素的所有屬性。

前期準備:

下載dom4j解析xml文檔所需要的jar包:根據需要下載和合適的dom4j

具體的代碼展示與解析:

步驟:

  • 1、獲得解析器工廠
  • 2、根據解析器工廠獲得解析器
  • 3、根據解析器獲得Document對象
  • 4、根據解析器獲得Doucumen對象
  • 5、根據Document對象獲得根元素
    • 從根元素獲取根下面所有的子元素
    • 得到子元素可以獲取元素標籤和內容以及屬性
    • 根據標籤和內容以及屬性可以進行增刪改查操作
  • 6、最後一步進行回寫操作(如果有必要)

首先附上books.xml

<?xml version="1.0" encoding="utf-8"?>
<books> 
  <book id='1'> 
    <id>001</id>  
    <name>Python3網絡爬蟲開發實戰</name>  
    <author>崔慶才</author>  
    <price>75.0</price>  
    <addNode>添加的節點</addNode> 
  </book>  
  <book id='2'>
    <id>002</id>
    <name>Linux鳥哥的私房菜</name>
    <author>鳥哥</author>
    <price>70.0</price>
  </book>
</books>

dom4j對xml文件的基本操作:

public static void main(String[] args) {
		// 1.獲得解析器
		SAXReader reader = new SAXReader();
		try {
			// 2.根據解析器獲得document對象
			Document document = reader.read(new File("xml/books.xml"));
			// 3.獲得根元素
			Element rootElement = document.getRootElement();
			// 4.獲得根元素下所有的子元素
			List<Element> list = rootElement.elements();
			// 5.遍歷子元素
			for (Element element : list) {
				// 6.獲得元素的屬性
				String attribute = element.attributeValue("id");
				System.out.println(attribute);
				// 7.獲得子元素下所有的子元素
				List<Element> elements = element.elements();
				// 8.遍歷所有子元素下所有的子元素
				for (Element element2 : elements) {
					System.out.println(element2.getText());
				}
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}

dom4j對xml文件的增加操作:

	@Test
	// 添加元素操作
	public void Test1() throws DocumentException, IOException {
		// 1、獲得document對象
		Document document = saxReaderUtil.getDocument("xml/books.xml");
		// 2、獲得根元素
		Element rootElement = document.getRootElement();
		// 3、獲得要插入的位置
		Element book = rootElement.element("book");
		List<Element> list = book.elements();
		// 4、創建元素並插入到book中
		Element addElement = book.addElement("addNode");
		addElement.addText("添加的節點");
		// Element address = DocumentHelper.createElement("address");
		// address.setText("河南南陽");

		// Element addText = address.addText("河南南陽");
		// System.out.println(address);
		// System.out.println(addText);
		// 5、添加元素
		// book.add(address);
		saxReaderUtil.backWrite(document, "xml/books.xml");
	}

	@Test
	// 在指定位置添加元素操作
	public void Test2() throws DocumentException, IOException {
		// 1、獲得document對象
		Document document = saxReaderUtil.getDocument("xml/books.xml");
		// 2、獲得根元素
		Element rootElement = document.getRootElement();
		// 3、獲得根下的子元素
		Element book = rootElement.element("book");
		// 創建元素
		Element data = DocumentHelper.createElement("data");
		data.setText("2016-12-15");
		// 獲得book下的所有子元素
		List<Element> list = book.elements();
		list.add(1, data);
		// 回寫
		saxReaderUtil.backWrite(document, "xml/books.xml");
	}

	@Test
	// 添加屬性
	public void Test4() throws DocumentException {
		// 1、獲得document對象
		Document document = saxReaderUtil.getDocument("xml/books.xml");
		// 2、獲得根元素
		Element rootElement = document.getRootElement();
		// 3、獲得根下的子元素
		Element book = rootElement.element("book");
		// 添加屬性language
		book.addAttribute("language", "zh");
		// 回寫
		saxReaderUtil.backWrite(document, "xml/books.xml");
	}

dom4j對xml文件的刪除操作:

	@Test
	// 添加元素操作
	public void Test1() throws DocumentException, IOException {
		// 1、獲得document對象
		Document document = saxReaderUtil.getDocument("xml/books.xml");
		// 2、獲得根元素
		Element rootElement = document.getRootElement();
		// 3、獲得要插入的位置
		Element book = rootElement.element("book");
		List<Element> list = book.elements();
		// 4、創建元素並插入到book中
		Element addElement = book.addElement("addNode");
		addElement.addText("添加的節點");
		// Element address = DocumentHelper.createElement("address");
		// address.setText("河南南陽");

		// Element addText = address.addText("河南南陽");
		// System.out.println(address);
		// System.out.println(addText);
		// 5、添加元素
		// book.add(address);
		saxReaderUtil.backWrite(document, "xml/books.xml");
	}

	@Test
	// 在指定位置添加元素操作
	public void Test2() throws DocumentException, IOException {
		// 1、獲得document對象
		Document document = saxReaderUtil.getDocument("xml/books.xml");
		// 2、獲得根元素
		Element rootElement = document.getRootElement();
		// 3、獲得根下的子元素
		Element book = rootElement.element("book");
		// 創建元素
		Element data = DocumentHelper.createElement("data");
		data.setText("2016-12-15");
		// 獲得book下的所有子元素
		List<Element> list = book.elements();
		list.add(1, data);
		// 回寫操作
		saxReaderUtil.backWrite(document, "xml/books.xml");
	}

	@Test
	// 添加屬性
	public void Test4() throws DocumentException {
		// 1、獲得document對象
		Document document = saxReaderUtil.getDocument("xml/books.xml");
		// 2、獲得根元素
		Element rootElement = document.getRootElement();
		// 3、獲得根下的子元素
		Element book = rootElement.element("book");
		// 添加屬性language
		book.addAttribute("language", "zh");
		// 回寫
		saxReaderUtil.backWrite(document, "xml/books.xml");
	}

dom4j對xml文件的修改操作:

	@Test
	// 修改元素操作
	public void Test6() throws DocumentException {
		// 1.獲得document對象
		Document document = saxReaderUtil.getDocument("xml/books.xml");
		// 2.獲得xml文件的根元素
		Element rootElement = document.getRootElement();
		// 3.獲得book元素下的子元素data元素
		Element book = rootElement.element("book").element("data");
		book.setText("1997-12-15");
		// 4.進行回寫操作
		saxReaderUtil.backWrite(document, "xml/books.xml");
	}

	@Test
	// 修改元素屬性
	public void Test7() throws DocumentException {
		// 1.獲得document對象
		Document document = saxReaderUtil.getDocument("xml/books.xml");
		// 2.獲得xml文件的根元素
		Element rootElement = document.getRootElement();
		// 3.獲得book元素
		Element book = rootElement.element("book");
		// 4.設置修改屬性值
		book.addAttribute("language", "en");
		// book.setAttributeValue("language", "en");//過時的代替的方式是addAttribute
		// 5.進行回寫操作
		saxReaderUtil.backWrite(document, "xml/books.xml");
	}

將dom4j中的獲取Document對象和回寫操作封裝起來:

進行回寫的原因:對books.xml文件的增刪改操作只是在內存中,我們需要將內存中已經增刪改之後的結果重新刷到books.xml文件中
官方的得到Document對象:

public Document parse(URL url) throws DocumentException {
        SAXReader reader = new SAXReader();
        //url爲xml文件的路徑
        Document document = reader.read(url);
        return document;
    }

官方的將文檔寫入文件

//通過該方法可以快速簡便地將Document(或任何Node)寫入a 。 Writerwrite()
FileWriter out = new FileWriter("foo.xml");
document.write(out);
out.close();

根據文檔自己編寫的:

//saxReaderUtil類
public class saxReaderUtil {
	public static Document getDocument(String uri) throws DocumentException {
		// 獲得解析器工廠
		SAXReader reader = new SAXReader();
		// 根據解析器工廠獲得document
		Document document = reader.read(new File(uri));
		// 返回document對象
		return document;
	}

	// 回寫操作
	public static void backWrite(Document document, String uri) {
		try {
			// 方法creatCompactFormat()是不可以格式化文件
			// OutputFormat of = OutputFormat.createCompactFormat();
			// 方法creatPrettyPrint是可以格式文件的
			// OutputFormat of = OutputFormat.createPrettyPrint();
			// XMLWriter writer = new XMLWriter(new OutputStreamWriter(new
			// FileOutputStream("xml/books.xml"),"utf-8"),of);
			// writer.write(document);
			// writer.close();
			// 問題:亂碼
			// 原因:使用FileWriter默認的編碼是GBK,而books.xml的編碼格式是utf-8
			// 解決亂碼的方案使用OutputStreamWriter

			// 解決亂碼的方案二:
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("utf-8");
			XMLWriter writer = new XMLWriter(new FileOutputStream(uri), format);
			writer.write(document);
			writer.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章