# java對xml文件的基本操做

下面是簡單的總結三種經常使用的java對xml文件的操做

1. dom方式對xml進行操做,這種操做原理是將整個xml文檔讀入內存總,在內存中進行操做,當xml文檔很是龐大的時候就會出現內存溢出的異常,這種方式能夠進行增刪改查的操做。
2. sax方式進行xml的操做,這種方式則不是將整個xml文檔讀入到內存中進行操做,sax的操做方式是實時將文檔中的數據進行處理,這種方式是一個標籤一個標籤的進行讀取,而後由程序員去實現一個自定義的操做,那麼這裏須要去實現ContentHandler這個接口中的方法,可是這種方式只能讀取xml中的數據,效率快,不佔用太大內存。
3. dom4j這是有第三方提供的一種解析方式,咱們須要去下載dom4j.jar才能進行使用,這種方式結合了前兩種的一些優點,也是比較經常使用的一種解析方式。
1、dom對xml的基本操做
<?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;
    }
}
2、sax對xml的基本操做
<?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

3、dom4j對xml的基本操做
<?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

相關文章
相關標籤/搜索