1)有關XML簡介 XML(EXtensible Markup Language)可擴展標記語言 特點:XML與操作系統、編程語言的開發平臺無關 實現不同系統之間的數據交換 作用:數據交換、配置應用程式和網站 大致文檔結構: XML文檔內容由一系列標簽元素組成: XML編寫註意事項: 所有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:增刪改查d
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與DOM4J解析XML:增刪改查讀
需要結合DOM4j架包使用:下載鏈接地址如下:
需要先將架包引用到項目中:
代碼演示如下:
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"); } }