Java---XML的解析(1)-DOM解析
本章只講DOM解析。接下來還會學習Dom4j和StAX 解析技術
DOM解析:
DOM解析一次將所有的元素全部加載到內存中:如有以下XML文檔:
1
2
3
4
由于DOM解析,一次性的將所有元素(包含屬性和文本) 全部加載到內存中,所以不適用于解析大量的數據。
JAXP-DOM解析:
包:
javax.xml.parse – 關鍵類DocumentBuilder,文檔解析對像。
org.w3c.dom – 關鍵類Document代表內存中的文檔對像模型。
java.xml – 關鍵類Transformer,用于將內存中的文檔保存到文件中。
users.xml:-在xml4文件夾下面
1
2
3
4
5
6
7
8
9
10
11
12
代碼演示:
package cn.hncu.dom; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.junit.Test; 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; /** * @author 陳浩翔 2016-6-29 */ public class DomDemo1 { @Test // 需求:把第一個user節點的name的值取出來 public void getDom() throws SAXException, IOException, ParserConfigurationException { // 第一步,通過DocumentBuilderFactory類中的工廠方法等到一個dbf對象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 第二步,通過dbf對象創建出一個DocumentBuilder對象 DocumentBuilder db = dbf.newDocumentBuilder(); // 第三步,通過db對象創建出一個Document對象 Document dom = db.parse("xml4/users.xml"); // db.parse( new File("xml4/users.xml") );//也可以 System.out.println(dom);// [#document: null] Node root = dom.getFirstChild();// 這個是根節點 System.out.println("root:" + root);// root:[users: null] System.out.println(root.getNodeName());// users System.out.println(root.getFirstChild().getNodeName());// #text // 上面一句的輸出是:#text ----dom中把空白符也看成是一個Node,這種情況對我們的解析通常會造成很大的麻煩 // ※※為解決上面的問題,我們以后解析時盡量不要用Node,而要用Element。 // 因為Element是元素它不包含屬性和文字內容(包括空白符),因此可避開空白符的干擾 Element eRoot = (Element) root; NodeList list = eRoot.getElementsByTagName("user"); System.out.println("user元素的數量:" + list.getLength()); System.out.println("第2個user元素" + list.item(1)); Node user1Node = list.item(0); Element eUser1 = (Element) user1Node;// 要把Node強轉成Element,因為Element是子接口,里面有getElementBy*等方法,而Node沒有(只能采用childNodes的方式,這種方式會受空白符的干擾) NodeList listNames = eUser1.getElementsByTagName("name"); String nm = listNames.item(0).getNodeName();// name--標簽名 String nmVal = listNames.item(0).getTextContent();// 標簽內部所包含的文本內容----相當于JavaScript中的innerText System.out.println(nm + "," + nmVal); } @Test //需求:把第二個user節點的age值取出來 public void getAge()throws Exception{ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document dom = db.parse(new File("xml4/users.xml")); Element root = (Element)dom.getFirstChild(); Element user2 = (Element)root.getElementsByTagName("user").item(1); Element eAge = (Element)user2.getElementsByTagName("age").item(0); String age = eAge.getTextContent(); System.out.println("age:"+age); } //用java對xml文檔進行CRUD---創建,遍歷,更新,刪除 //創建---需求:添加一個新的user @Test public void create() throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder db = factory.newDocumentBuilder(); Document dom = db.parse(new File("xml4/users.xml")); Element root = (Element) dom.getFirstChild(); //創建一個新的user元素 Element eUserNode = dom.createElement("user"); eUserNode.setAttribute("id", "C001");//給元素添加屬性 //創建name和age子元素 Element eName = dom.createElement("name"); eName.setTextContent("李四");//設置name標簽容器中包含的文字 Element eAgeNode = dom.createElement("age"); eAgeNode.setTextContent("33"); //把所創建的元素組裝成一顆子樹,添加到整顆dom樹上 eUserNode.appendChild(eName); eUserNode.appendChild(eAgeNode); root.appendChild(eUserNode); //再把當前內存中的dom對象存儲進xml文件 TransformerFactory tf = TransformerFactory.newInstance(); Transformer trans = tf.newTransformer(); trans.transform(new DOMSource(dom), new StreamResult("xml4/users.xml")); } //遍歷---查找 @Test public void query() throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder db = factory.newDocumentBuilder(); Document dom = db.parse("xml4/users.xml"); Element root = (Element) dom.getFirstChild();//得到根節點 NodeList list = root.getElementsByTagName("user");//這個user是xml文檔中的元素 for(int i=0;i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 小知識點: 注意:子類才可以當父類用。 父類的話,如果你確定那個類一定是這個父類的某個子類了,才可以強轉為子類?。?! Java XML
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。