1. dom方式對xml進行操做,這種操做原理是將整個xml文檔讀入內存總,在內存中進行操做,當xml文檔很是龐大的時候就會出現內存溢出的異常,這種方式能夠進行增刪改查的操做。 2. sax方式進行xml的操做,這種方式則不是將整個xml文檔讀入到內存中進行操做,sax的操做方式是實時將文檔中的數據進行處理,這種方式是一個標籤一個標籤的進行讀取,而後由程序員去實現一個自定義的操做,那麼這裏須要去實現ContentHandler這個接口中的方法,可是這種方式只能讀取xml中的數據,效率快,不佔用太大內存。 3. dom4j這是有第三方提供的一種解析方式,咱們須要去下載dom4j.jar才能進行使用,這種方式結合了前兩種的一些優點,也是比較經常使用的一種解析方式。
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <書架> <書> <書名>科學怪人</書名> <做者>張三</做者> <售價>20.0元</售價> </書> <書> <書名>java</書名> <做者>扎笑道</做者> </書> </書架>
下面這個例子就是簡單操做xml的例子:
要求:對上面這個xml文件進行操做java
package com.cn.ljh.jaxpxml; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; 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; public class JaxpXml { public static void main(String [] args) throws Exception{ //一、建立一個工廠類 DocumentBuilderFactory doucumentfactory = DocumentBuilderFactory.newInstance(); //二、建立一個解析器 DocumentBuilder builder = doucumentfactory.newDocumentBuilder(); Document document = builder.parse("src/Books.xml"); test7(document); } //一、在第一個元素上在增長一個子元素 public static boolean test1(Document document) throws Exception{ //先建立一個新的元素 Element element = document.createElement("內部價"); element.setTextContent("1元"); //得到父節點 Node node = document.getElementsByTagName("書").item(0); //將新建立的節點添加上去 node.appendChild(element); //將內存中的數據寫入到硬盤 TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult("src/Books.xml")); return true; } //二、在第一個元素的第一個子元素前面增長一個兄弟元素 public static boolean test2(Document document) throws TransformerException { //建立一個新的元素 Element element = document.createElement("筆名"); element.setTextContent("大俠"); //獲取插入位置的元素 Node node = document.getElementsByTagName("書名").item(0); System.err.println(node.getTextContent()); node.insertBefore(element, node); //node.appendChild(element); //將內存中的數據寫入到硬盤上 TransformerFactory factory = TransformerFactory.newInstance(); factory.newTransformer().transform(new DOMSource(document), new StreamResult("src/Books.xml")); return true; } //三、刪除第一個元素的第一個子元素 public static boolean test3(Document document) throws Exception{ //獲得第一個節點 Node node = document.getElementsByTagName("內部價").item(0); //得到父節點 node.getParentNode().removeChild(node); //將內存中的數據寫入硬盤中 TransformerFactory factory = TransformerFactory.newInstance(); factory.newTransformer().transform(new DOMSource(document), new StreamResult("src/Books.xml")); return true; } //四、刪除第一個元素 public static boolean test4(Document document){ Node node = document.getElementsByTagName("書").item(0); node.getParentNode().removeChild(node); TransformerFactory factory = TransformerFactory.newInstance(); try { factory.newTransformer().transform(new DOMSource(document), new StreamResult("src/Books.xml")); } catch (TransformerException e) { // TODO Auto-generated catch block e.printStackTrace(); } return true; } //五、在第二個元素上增長屬性 public static void test5(Document document) throws Exception{ Node node = document.getElementsByTagName("書").item(0); Element element = (Element) node; element.setAttribute("出版社","四川出版社"); //將文件寫入硬盤 TransformerFactory factory = TransformerFactory.newInstance(); factory.newTransformer().transform(new DOMSource(document), new StreamResult("src/Books.xml")); } //六、刪除第一個元素的屬性 public static void test6(Document document) throws Exception{ //得到第一個節點 Node node = document.getElementsByTagName("書").item(0); Element element = (Element) node; element.removeAttribute("出版社"); TransformerFactory factory = TransformerFactory.newInstance(); factory.newTransformer().transform(new DOMSource(document), new StreamResult("src/Books.xml")); } //七、增長一個新的完整的元素,這個元素有三個子元素,而且添加一個屬性 public static void test7(Document document) throws Exception{ //建立一個新的元素 Element oneE = document.createElement("書"); Element towE = document.createElement("書名"); towE.setTextContent("java"); Element towW = document.createElement("做者"); towW.setTextContent("扎笑道"); //獲取父節點(書架) Node node = document.getFirstChild(); node.appendChild(oneE); oneE.appendChild(towE); oneE.appendChild(towW); TransformerFactory factory = TransformerFactory.newInstance(); factory.newTransformer().transform(new DOMSource(document), new StreamResult("src/Books.xml")); } //八、獲取第一個元素的第一個子元素的內容 public static boolean test8(Document document){ NodeList nodelist = document.getElementsByTagName("書名"); Node node = nodelist.item(0); String name = node.getTextContent(); System.out.println(name); return false; } //九、獲取屬性內容 public static void test9(Document document){ NodeList nodelist = document.getElementsByTagName("書"); Node node = nodelist.item(0); Element element = (Element) node; String attName = element.getAttribute("id"); System.out.println(attName); } //十、循環遍歷打印標籤內容 public static void test10(Node node){ //判斷是否是Node類型 short type = node.getNodeType(); if(type == Node.ELEMENT_NODE){ System.out.println(node.getNodeName()); } NodeList nodelist = node.getChildNodes(); long len = nodelist.getLength(); for(int i=0;i<len;i++){ Node n = nodelist.item(i); test10(n); } } //十一、修改第一本書的書名的內容 public static boolean test11(Document document) throws Exception{ //獲得第一本書 NodeList nodelist = document.getElementsByTagName("書名"); //獲得第一本書的書名元素 Node node = nodelist.item(0); node.setTextContent("商人"); //將內存中的數據寫到硬盤上 TransformerFactory factory = TransformerFactory.newInstance(); factory.newTransformer().transform(new DOMSource(document), new StreamResult("src/Books.xml")); return true; } }
<?xml version="1.0" encoding="UTF-8"?> <movies> <movie> <name>捉妖記</name> <time>2015</time> <director>許誠毅</director> </movie> <movie> <name>老炮兒</name> <director>馮小剛</director> <time>2016</time> </movie> </movies>
下面這個例子就是sax對xml的基本操做:
要求:對上面的xml文件進行內容讀取,而後進行數據的封裝node
數據封裝類程序員
package com.cn.ljh.sax; public class Movie { private String name; private String time; private String director; public Movie(){ } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } public String getDirector() { return director; } public void setDirector(String director) { this.director = director; } }
sax操做類設計模式
package com.cn.ljh.sax; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; public class SaxTeat { //如今要求將xml文檔中的全部內容讀取到movie中進行封裝 public static void main(String[] args) throws Exception { //下面就是sax解析xml的方式 //建立sax解析工廠 SAXParserFactory factory = SAXParserFactory.newInstance(); //建立sax的解析器 SAXParser parser = factory.newSAXParser(); //建立xml讀取器 XMLReader reader = parser.getXMLReader(); List<Movie> movies = new ArrayList<Movie>();//存儲電影數據 //掛載解析器(並實現解析其中的方法) reader.setContentHandler(new DefaultHandler(){ Movie movie = null; String tag = null; //讀取到元素開始,執行該方法 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); if("movie".equals(qName)){ movie = new Movie(); } tag = qName; } //讀取到元素結束,執行該方法 public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); if("movie".equals(qName)){ movies.add(movie); } } //讀取到內容,執行該方法 public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); if("name".equals(tag)){ movie.setName(new String(ch,start,length)); } if("time".equals(tag)){ movie.setTime(new String(ch, start, length)); } if("director".equals(tag)){ movie.setDirector(new String(ch,start,length)); } tag = null; } }); reader.parse("src/movie.xml"); for(Movie m : movies){ System.out.println(m.getName()); System.out.println(m.getDirector()); System.out.println(m.getTime()); } } }
能夠看到上面,我沒有去實現ContentHandler這個接口,我是去繼承了DefaultHandler類,這裏用到了適配器的設計模式(這樣咱們能夠更加方便的去實現裏面的方法)。同時咱們也能夠看出來,這個類中的方法就像是事件同樣的方法,當解析器讀到每個標籤或者內容都會觸發這些方法,因此,這些方法須要本身去實現。同時,這樣操做咱們還須要將數據進行封裝,這樣方便咱們之後的操做。app
<?xml version="1.0" encoding="UTF-8"?> <cars> <car time="2015"> <name>科魯茲</name> <color>白色</color> <price>1500000</price> <oil>10.L</oil> </car> <car where="中國"> <name>新蒙迪歐</name> <price>1700000</price> </car> <car where="japan"> <name>豐田</name> <color>黑色</color> <price>1000000</price> </car> </cars>
下面這個例子就是dom4j對xml的基本操做
要求:對上面的xml文件進行一些簡單的操做dom
package com.cn.ljh.Dom4j; import java.io.FileWriter; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; public class Dom4jTest { // 對cas這個xml文件進行操做,利用dom4j的方式 // 1.獲得第一輛車的名字 @Test public void test1() throws Exception { SAXReader read = new SAXReader(); // 獲得文檔樹 Document document = read.read("src/cars.xml"); // 獲得根元素 Element root = document.getRootElement(); List<Element> elements = root.elements("car"); // 獲得第一個car元素 Element e = elements.get(0); // 獲得name元素 Element name_E = e.element("name"); String name = name_E.getText(); System.out.println("name= " + name); } // 2.獲得第二輛車的屬性 @Test public void test2() throws Exception { // 獲得讀取器 SAXReader read = new SAXReader(); Document document = read.read("src/cars.xml"); // 獲得根元素 Element root = document.getRootElement(); // 獲得全部車的元素 List<Element> es = root.elements("car"); // 獲得第二個車的元素 Element car2 = es.get(1); Attribute att = car2.attribute("where"); String where = att.getText(); System.out.println("where=" + where); } // 3.獲得第二輛車的價格 @Test public void test3() throws Exception { SAXReader read = new SAXReader(); Document document = read.read("src/cars.xml"); Element root = document.getRootElement(); List<Element> cars = root.elements("car"); Element car = cars.get(1); // 獲得價格 Element price = car.element("price"); String text = price.getText(); System.out.println(text); } // 4.添加第一輛車一個屬性 @Test public void test4() throws Exception { SAXReader read = new SAXReader(); Document document = read.read("src/cars.xml"); Element root = document.getRootElement(); List<Element> cars = root.elements("car"); Element car = cars.get(0); // 添加屬性 car.addAttribute("time", "2015"); // 將內存中的數據寫到硬盤上 XMLWriter writer = new XMLWriter(new FileWriter("src/cars.xml")); writer.write(document); writer.close(); String text = car.attribute("time").getText(); System.out.println(text); } // 5.刪除第一輛車的屬性 @Test public void test5() throws Exception { SAXReader read = new SAXReader(); Document document = read.read("src/cars.xml"); Element root = document.getRootElement(); List<Element> cars = root.elements("car"); Element car = cars.get(0); // 獲得第一輛車的屬性 Attribute att = car.attribute("where"); // 刪除屬性 car.remove(att); // 將內存中的數據寫入到硬盤上 XMLWriter writer = new XMLWriter(new FileWriter("src/cars.xml")); writer.write(document); writer.close(); } // 6.給第一輛車添加油耗元素 @Test public void test6() throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read("src/cars.xml"); Element root = document.getRootElement(); List<Element> cars = root.elements("car"); Element car = cars.get(0); // 添加一個元素 car.addElement("oil").addText("10.L"); // 將數據寫入到內存中 XMLWriter writer = new XMLWriter(new FileWriter("src/cars.xml")); writer.write(document); writer.close(); } // 7.刪除第二輛車的顏色的元素 @Test public void test7() throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read("src/cars.xml"); Element root = document.getRootElement(); List<Element> cars = root.elements("car"); Element car = cars.get(1); Element color = car.element("color"); car.remove(color); // 將數據寫入到硬盤上 XMLWriter writer = new XMLWriter(new FileWriter("src/cars.xml")); writer.write(document); writer.close(); } // 8.打印全部的標籤內容和名字 @Test public void test8() throws Exception{ SAXReader reader = new SAXReader(); Document document = reader.read("src/cars.xml"); Element root = document.getRootElement(); //遍歷全部元素 print(root); } //遍歷全部元素的方法 private void print(Element element){ String text_name = element.getName(); String text = element.getText(); System.out.println("name = "+text_name+"text = "+text); for(int i=0,size = element.nodeCount(); i < size;i++){ Node node = element.node(i); if(node instanceof Element){ print((Element) node); } } } // 9.建立一個完整的car,包含屬性 @Test public void test9() throws Exception{ SAXReader reader = new SAXReader(); Document document = reader.read("src/cars.xml"); Element root = document.getRootElement(); Element car = root.addElement("car") .addAttribute("where", "japan"); car.addElement("name").addText("豐田"); car.addElement("color").addText("黑色"); car.addElement("price").addText("1000000"); //將內存中的數據寫入到硬盤中 XMLWriter writer = new XMLWriter(new FileWriter("src/cars.xml")); writer.write(document); writer.close(); } }
那麼上面這些例子只是簡單的以dom4j的方式進行簡單的操做,dom4j的功能還有很是多,當咱們須要使用這種方式去操做一個xml的時候能夠去研究官方文檔。dom4j的操做方式要比上面的兩種簡單高效。學習
記錄學習的每一步,記錄每一次的成長!!!!ui