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");
}
}