JAXP即Java Api for Xml PRocessing該API主要是SUN提供的用于解析XML數(shù)據(jù)的一整套解決方案,主要包含了DOM和SAX解析技術(shù)。大家可以參見SUN的以下兩個(gè)包:
javax.xml.parsers.* à主要存儲的是解析器
org.w3c.dom.*或org.w3c.sax.* à主要存儲的是DOM解析或SAX解析需要的API
DOM解析主要采用DOM樹的方式進(jìn)行XML的數(shù)據(jù)解析。如:JavaScript中的DOM操作
SAX解析主要采用事件的方式進(jìn)行XML的數(shù)據(jù)解析。如:Javascript中的事件機(jī)制
XML解析原理DOM解析采用的是DOM樹的方式進(jìn)行解析。
<?xml version="1.0" encoding="UTF-8"?><!-- 1. 編寫要解析的XML文件 --><users></users>
2. 獲取解析器// 2. 提供獲取解析器的方法 public static DocumentBuilder getParser()throws Exception{ // 2.1 創(chuàng)建工廠類對象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 2.2 獲取解析器對象 DocumentBuilder parser = factory.newDocumentBuilder(); return parser; }3. 獲取解析的DOM樹對象// 3. 提供獲取DOM數(shù)據(jù)的方法 public static Document getDOM(File file)throws Exception{ // 3.1 獲取解析器 DocumentBuilder parser = getParser(); // 3.2解析數(shù)據(jù) Document dom = parser.parse(file); return dom; }4. 獲取根元素// 4. 提供解析根元素的數(shù)據(jù)的方法 public static void getRoot(File file)throws Exception{ // 4.1 獲取DOM樹 Document dom = getDOM(file); // 4.2遍歷dom樹找根元素 Node node = dom.getElementsByTagName("users").item(0); // 4.3輸出根元素的名 System.out.println(node.getNodeName()); }5. 通過關(guān)系獲取根元素// 4. 提供解析根元素的數(shù)據(jù)的方法 public static void getRoot(File file)throws Exception{ // 4.1 獲取DOM樹 Document dom = getDOM(file); // 4.2遍歷dom樹找根元素 Node node = dom.getElementsByTagName("users").item(0); // 4.3輸出根元素的名 System.out.println(node.getNodeName()); // 4.4根據(jù)節(jié)點(diǎn)直接的關(guān)系獲取根元素 NodeList list = dom.getChildNodes(); Node root = list.item(0); System.out.println(root.getNodeName()); root = dom.getFirstChild(); System.out.println(root.getNodeName()); root = dom.getLastChild(); System.out.println(root.getNodeName()); }6. 添加元素// 5. 添加一個(gè)user節(jié)點(diǎn) public static Document addElement(File file)throws Exception{ // 5.1獲取DOM樹 Document dom = getDOM(file); // 5.2創(chuàng)建user元素 Element user = dom.createElement("user"); Element name = dom.createElement("name"); Element age = dom.createElement("age"); Element address = dom.createElement("address"); name.setTextContent("焦寧波"); age.setTextContent("28"); address.setTextContent("天河區(qū)"); // 5.3建立關(guān)系 Element root = (Element) dom.getFirstChild(); user.appendChild(name); user.appendChild(age); user.appendChild(address); root.appendChild(user); // 5.4返回修改后的DOM樹對象 return dom; }7. 為了讓內(nèi)存中的修改的DOM樹持久化到磁盤文件需要定義以下方法// 提供一個(gè)工具方法將內(nèi)存中的DOM樹存儲到磁盤的指定文件中 public static void writeDOM2XML(Document dom,File file)throws Exception{ // 1.獲取轉(zhuǎn)換器的工廠類對象 TransformerFactory factory = TransformerFactory.newInstance(); // 2.獲取轉(zhuǎn)換器對象 Transformer trans = factory.newTransformer(); // 3.轉(zhuǎn)換 trans.transform(new DOMSource(dom), new StreamResult(new FileOutputStream(file))); }8. 修改元素 // 6. 修改第二個(gè)user的年齡為30歲 public static Document modifyElement(File file)throws Exception{ // 6.1獲取DOM樹 Document dom = getDOM(file); // 6.2獲取第二個(gè)age元素 Node age2 = dom.getElementsByTagName("age").item(1); // 6.3設(shè)置文本值 age2.setTextContent("30"); return dom; }9. 刪除元素// 7. 刪除第一個(gè)user節(jié)點(diǎn) public static Document removeElement(File file)throws Exception{ // 7.1獲取DOM樹 Document dom = getDOM(file); // 7.2獲取user的父親 Node users = dom.getFirstChild(); // 7.2獲取需要斷絕關(guān)系的孩子節(jié)點(diǎn) Node user1 = dom.getElementsByTagName("user").item(0); // 7.3斷絕關(guān)系 users.removeChild(user1); return dom;10. 加強(qiáng)使用關(guān)系獲取元素// 8. 使用關(guān)系獲取節(jié)點(diǎn) public static void searchElement(File file)throws Exception{ // 8.1獲取DOM樹 Document dom = getDOM(file); // 8.2獲取第二個(gè)user的所有的子元素并輸入元素名 Element user2 = (Element) dom.getElementsByTagName("user").item(1); // 8.3獲取所有的兒子 NodeList list = user2.getChildNodes(); // 8.4遍歷所有的孩子 for(int i = 0;i<list.getLength();i++){ Node node = list.item(i); System.out.println(node.getNodeName()); } // 8.5獲取第二個(gè)user的address元素 Element address2 = (Element) list.item(2); System.out.println(address2.getNodeName()); Node age2 = address2.getPreviousSibling(); System.out.println(age2.getNodeName()); Element name2 = (Element) list.item(0); System.out.println(name2.getNodeName()); age2 = name2.getNextSibling(); System.out.println(age2.getNodeName()); }11. 屬性的操作// 9. 屬性操作 public static Document optionAttribute(File file)throws Exception{ // 9.1獲取DOM樹 Document dom = getDOM(file); // 9.2獲取所有的user元素 NodeList list = dom.getElementsByTagName("user"); // 9.3遍歷節(jié)點(diǎn) for (int i = 0; i < list.getLength(); i++) { Element user = (Element)list.item(i); // 添加屬性 user.setAttribute("id", "00"+(i+1)); } // 9.4 獲取屬性 Element user2 = (Element) list.item(1); String value = user2.getAttribute("id"); System.out.println(value); // 9.5修改屬性 user2.setAttribute("id", "007"); // 9.5刪除屬性 user2.removeAttribute("id"); return dom; }總結(jié):在實(shí)際的項(xiàng)目開發(fā)中我們經(jīng)常遇到的XML數(shù)據(jù)時(shí)比較大的,如果使用DOM進(jìn)行數(shù)據(jù)的解析,那么首先在內(nèi)存中會(huì)形成一個(gè)DOM樹結(jié)構(gòu)。因此容易導(dǎo)致內(nèi)存的一個(gè)溢出。所以不建議大家使用DOM解析進(jìn)行操作較大的XML數(shù)據(jù)。如果只是需要進(jìn)行XML文件的數(shù)據(jù)獲取,那么推薦使用SAX解析。新聞熱點(diǎn)
疑難解答
圖片精選