java解析XML

1)有關XML簡介

    XML(EXtensible Markup Language)可擴展標記語言

    特點:XML與操作系統、編程語言的開發平臺無關

               實現不同系統之間的數據交換

    作用:數據交換、配置應用程序和網站

文檔結構:

    

XML文檔內容由一系列標籤元素組成:

    

XML編寫注意事項:

    所有XML元素都必須有結束標籤

    XML標籤對大小寫敏感

    XML必須正確的嵌套

    同級標籤以縮進對齊

    元素名稱可以包含字母、數字或其他的字符

    元素名稱不能以數字或者標點符號開始

    元素名稱中不能含空格

XML中的轉義符列表:

    

2)解析XML技術:

    DOM:

            基於XML文檔樹結構的解析

            適用於多次訪問的XML文檔

            特點:比較消耗資源

    SAX:

            基於事件的解析

            適用於大數據量的XML文檔

            特點:佔用資源少,內存消耗小

    DOMJ4:

            非常優秀的java XML API

            性能優異、功能強大

            開放源代碼

2-1)DOM解析XML:增刪改查

    DOM介紹:文檔對象模型(Document Object Model):DOM把XML文檔映射成一個倒掛的樹

    

代碼演示DOM解析XML

package text;

import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class XmlText {
	//private static Document parse;
	public static void main(String[] args) throws Exception {
		// text();
		//add();
		// delete();
		//modfiy();
	}
	/**
	 * 循環解析XML
	 * 
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 * @throws IOException
	 */
	public static void text() throws ParserConfigurationException,
			SAXException, IOException {
		// 創建工廠
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 1.創建解析器對象
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 2.創建文檔對象
		Document document = builder.parse("lbl/NewFile.xml");
		// 3.拿到節點集合
		NodeList list = document.getElementsByTagName("book");
		// 4.遍歷集合
		for (int i = 0; i < list.getLength(); i++) {
			// 拿到每個節點
			Element item = (Element) list.item(i);
			// 解析每個節點屬性的值
			String bookid = item.getAttribute("id");
			String bookType = item.getAttribute("type");
			System.out.println(bookid + "\t" + bookType);
			// 解析每個節點的子節點的值
			String bookName = item.getElementsByTagName("bookName").item(0)
					.getTextContent();
			String bookprice = item.getElementsByTagName("bookPrice").item(0)
					.getTextContent();
			String bookAuthor = item.getElementsByTagName("bookAuthor").item(0)
					.getTextContent();
			System.out.println(bookName + "\t" + bookprice + "\t" + bookAuthor);
		}
	}

	/**
	 * 添加節點
	 * 
	 * @throws Exception
	 */
	public static void add() throws Exception {
		// 創建工廠
		DocumentBuilderFactory newInstance = DocumentBuilderFactory
				.newInstance();
		// 創建解析器
		DocumentBuilder newDocumentBuilder = newInstance.newDocumentBuilder();
		// 創建文檔對象
		Document document = newDocumentBuilder.parse("lbl/NewFile.xml");
		// 僞造節點
		Element createElement = document.createElement("book");
		// 給節點屬性賦值
		createElement.setAttribute("id", "004");
		createElement.setAttribute("type", "動漫專題");
		// 僞造節點的子節點
		Element bookName = document.createElement("bookName");
		bookName.setTextContent("櫻桃小丸子");
		Element bookPrice = document.createElement("bookPrice");
		bookPrice.setTextContent("20");
		Element bookAuthor = document.createElement("bookAuthor");
		bookAuthor.setTextContent("無名");
		// 將三個節點綁定到一個節點下。變成某一節點的子節點
		createElement.appendChild(bookName);
		createElement.appendChild(bookPrice);
		createElement.appendChild(bookAuthor);
		// 把新建的節點,添加到根節點下
		document.getElementsByTagName("books").item(0)
				.appendChild(createElement);
		// 將修改後的文件,重寫到硬盤
		TransformerFactory transformerFactory = TransformerFactory
				.newInstance();
		// 創建轉換器
		Transformer transfromer = transformerFactory.newTransformer();
		// 要傳入的數據源
		Source source = new DOMSource(document);
		// 要傳入的路徑
		Result result = new StreamResult("lbl/NewFile.xml");
		// 轉換方法
		transfromer.transform(source, result);
		System.out.println("add  ok");

	}

	/**
	 * 修改節點
	 * 
	 * @throws Exception
	 */
	public static void modfiy() throws Exception {
		// 創建工廠
		DocumentBuilderFactory newInstance = DocumentBuilderFactory
				.newInstance();
		// 創建解析器
		DocumentBuilder newDocumentBuilder = newInstance.newDocumentBuilder();
		// 創建文檔對象
		Document document = newDocumentBuilder.parse("lbl/NewFile.xml");
		// 拿到要修改的節點
		Element item = (Element) document.getElementsByTagName("book").item(1);
		item.getElementsByTagName("bookName").item(0).setTextContent("我是測試xx");

		// 將修改後的文件,重寫到硬盤
		TransformerFactory transformerFactory = TransformerFactory
				.newInstance();
		// 創建轉換器
		Transformer transfromer = transformerFactory.newTransformer();
		// 要傳入的數據源
		Source source = new DOMSource(document);
		// 要傳入的路徑
		Result result = new StreamResult("lbl/NewFile.xml");
		// 轉換方法
		transfromer.transform(source, result);
		System.out.println("add  ok");
	}

	/**
	 * 刪除節點
	 * 
	 * @throws Exception
	 */
	public static void delete() throws Exception {
		// 創建工廠
		DocumentBuilderFactory newInstance = DocumentBuilderFactory
				.newInstance();
		// 創建解析器
		DocumentBuilder newDocumentBuilder = newInstance.newDocumentBuilder();
		// 創建文檔對象
		Document document = newDocumentBuilder.parse("lbl/NewFile.xml");
		// 拿到要刪除的節點
		Element item = (Element) document.getElementsByTagName("book").item(2);
		document.getElementsByTagName("books").item(0).removeChild(item);

		// 將修改後的文件,重寫到硬盤
		TransformerFactory transformerFactory = TransformerFactory
				.newInstance();
		// 創建轉換器
		Transformer transfromer = transformerFactory.newTransformer();
		// 要傳入的數據源
		Source source = new DOMSource(document);
		// 要傳入的路徑
		Result result = new StreamResult("lbl/NewFile.xml");
		// 轉換方法
		transfromer.transform(source, result);
		System.out.println("delete  ok");
	}
}

2-2)使用SAX解析XML:增刪改查

    需要結合DOM4j架包使用:下載鏈接地址如下:

    https://download.csdn.net/download/qq_41303423/10292699

    需要先將架包引用到項目中:

代碼演示如下:

package text;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4jXml {
	public static void main(String[] args) throws Exception {
		// 讀取XML
		// reader();
		// 添加XML節點
		// addXml();
		// 修改節點數據
		// modfiy();
		// modfiy1();
		// 刪除節點
		// delete();
		// delete1();
	}
	/**
	 * 讀取XML文件
	 */
	public static void reader() throws Exception {
		// 創建讀取器
		SAXReader reader = new SAXReader();
		// 讀取xml文檔
		Document read = reader.read("lbl/NewFile.xml");
		// 獲取根節點
		Element rootElement = read.getRootElement();
		// 遍歷根節點下的子節點信息
		for (Object item : rootElement.elements()) {
			// 拿到子節點下的值
			String text = ((Element) item).element("bookName").getText();
			System.out.println(text);
			// 拿到當前節點的屬性值
			System.out.println(((Element) item).attribute("id").getText());
		}
	}
	/**
	 * 向XML文件添加節點
	 */
	public static void addXml() throws Exception {
		// 創建讀取器
		SAXReader reader = new SAXReader();
		// 讀取xml文檔
		Document read = reader.read("lbl/NewFile.xml");
		// 獲取根節點
		Element rootElement = read.getRootElement();
		// 創建要添加的節點
		Element createElement = DocumentHelper.createElement("book");
		createElement.setAttributeValue("id", "003");
		createElement.setAttributeValue("type", "測試數據");
		// 創建添加的節點的3個子節點
		Element createElement1 = DocumentHelper.createElement("bookName");
		createElement1.setText("唔明書");
		Element createElement2 = DocumentHelper.createElement("bookPrice");
		createElement2.setText("20");
		Element createElement3 = DocumentHelper.createElement("bookAuthor");
		createElement3.setText("測試");
		// 把3個子節點 添加到book節點下
		createElement.add(createElement1);
		createElement.add(createElement2);
		createElement.add(createElement3);
		// 把book子節點添加到根節點下
		rootElement.add(createElement);
		// 重新將XML寫入硬盤
		OutputStream ou = new FileOutputStream("lbl/NewFile.xml");
		Writer wr = new OutputStreamWriter(ou, "utf-8");
		read.write(wr);
		wr.close();
		ou.close();
		System.out.println("add  ok");
	}
	/**
	 * 修改節點信息
	 */
	public static void modfiy() throws Exception {
		// 創建讀取器
		SAXReader reader = new SAXReader();
		// 讀取xml文檔
		Document read = reader.read("lbl/NewFile.xml");
		// 獲取根節點
		Element rootElement = read.getRootElement();
		// 拿到要修改的節點
		for (Object element : rootElement.elements()) {
			if (((Element) element).attribute("id").getText().equals("003")) {
				((Element) element).element("bookName").setText("數據測試!");
				break;
			}
		}
		/**
		 * ((Element) element).element("bookName").setName("數據測試!");修改節點name名稱
		 */
		// 重新將XML寫入硬盤
		OutputStream ou = new FileOutputStream("lbl/NewFile.xml");
		Writer wr = new OutputStreamWriter(ou, "utf-8");
		read.write(wr);
		wr.close();
		ou.close();
		System.out.println("modfiy  ok");
	}
	/**
	 * 修改節點信息方案二 Text
	 */
	public static void modfiy1() throws Exception {
		// 創建讀取器
		SAXReader reader = new SAXReader();
		// 讀取xml文檔
		Document read = reader.read("lbl/NewFile.xml");
		// 獲取根節點
		Element rootElement = read.getRootElement();
		// 拿到要修改的節點---方式二 Text true
		@SuppressWarnings("unchecked")
		List<Object> attributes = (rootElement.elements());
		Element ment = (Element) attributes.get(1);
		ment.element("bookName").setText("青年測試");
		// 重新將XML寫入硬盤
		OutputStream ou = new FileOutputStream("lbl/NewFile.xml");
		Writer wr = new OutputStreamWriter(ou, "utf-8");
		read.write(wr);
		wr.close();
		ou.close();
		System.out.println("modfiy  ok");
	}

	/**
	 * 刪除節點信息
	 */
	public static void delete() throws Exception {
		// 創建讀取器
		SAXReader reader = new SAXReader();
		// 讀取xml文檔
		Document read = reader.read("lbl/NewFile.xml");
		// 獲取根節點
		Element rootElement = read.getRootElement();
		// 拿到要修改的節點
		for (Object element : rootElement.elements()) {
			if (((Element) element).attribute("id").getText().equals("003")) {
				rootElement.remove(((Element) element));
				break;
			}
		}
		// 重新將XML寫入硬盤
		OutputStream ou = new FileOutputStream("lbl/NewFile.xml");
		Writer wr = new OutputStreamWriter(ou, "utf-8");
		read.write(wr);
		wr.close();
		ou.close();
		System.out.println("delete  ok");
	}

	/**
	 * 刪除節點方式二 Text true
	 */
	public static void delete1() throws Exception {
		// 創建讀取器
		SAXReader reader = new SAXReader();
		// 讀取xml文檔
		Document read = reader.read("lbl/NewFile.xml");
		// 獲取根節點
		Element rootElement = read.getRootElement();
		// 拿到要修改的節點---方式二 Text true
		@SuppressWarnings("unchecked")
		List<Object> attributes = (rootElement.elements());
		Element ment = (Element) attributes.get(1);
		rootElement.remove(ment);
		// 重新將XML寫入硬盤
		OutputStream ou = new FileOutputStream("lbl/NewFile.xml");
		Writer wr = new OutputStreamWriter(ou, "utf-8");
		read.write(wr);
		wr.close();
		ou.close();
		System.out.println("delete  ok");

	}
}









發佈了65 篇原創文章 · 獲贊 20 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章