• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Java中xml解析 SAX、PULL、DOM

    標簽: xml  java  sax  dom

    目錄

     

    一,什么是XML:

    二,XML的解析


    一,什么是XML:

    定義:XML指的是可擴展標記語言,主要用來傳輸和存儲數據。


    XML主要語法規則:

    XML標簽需要用戶自定義

    XML標簽使用時要關閉<標簽名> </標簽名>成對存在

    XML標簽對區分大小寫

    XML標簽必須正確的嵌套

    XML文檔有且只有一個根元素

    XML的屬性值要加引號

    XML中的空格換行符等會被當做內容讀取


    更多xml的詳情:http//www.w3school.com.cn/xml/index.asp


     

    二,XML的解析

    java的中對XML的解析有多種方式,本本文主要使用SAX,拉,DOM三種解析方式。

    解析的XML文件內容為:

    <?xml version="1.0" encoding="utf-8" ?>
    <students>
        <student id="1235">
            <name>小花</name>
            <age>25</age>
            <salary>3500</salary>
        </student>
        
        <student id="6121">
            <name>王五</name>
            <age>36</age>
            <salary>6000</salary>
        </student>
    
        <student id="4851">
            <name>里斯</name>
            <age>24</age>
            <salary>4000</salary>
        </student>
    </students>
    

    2.1 SAX解析

    SAX解析采用事件驅動的方式進行解析,逐行讀取XML文件,并逐行解析。

    public class Test {
        public static void main(String[] args) throws Exception{
            //創建SAX解析工廠
            SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
            //獲取解析器對象
            SAXParser parser=saxParserFactory.newSAXParser();
            //創建解析器處理對象
            MyHandler myHandler=new MyHandler();
            //傳入xml文件和解析器   開始解析xml
            parser.parse(new File("students.xml"),myHandler);
    
            List<Student> list=myHandler.getList();
            System.out.println("------------------------");
            for (Student s:list) {
                System.out.println("姓名:"+s.getName()+",年齡:"+s.getAge()+",工資:"+s.getSalary());
            }
        }
    }
    
    
    
    public class Student {
        private Integer id;
        private String name;
        private int age;
        private int salary;
    
        public int getSalary() {
            return salary;
        }
    
        public void setSalary(int salary) {
            this.salary = salary;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    
    
    public class MyHandler extends DefaultHandler {
    
    	/***
    	 * 將解析的內容存放到list中
    	 */
    	private List<Student> list;
        /***
         * 用于解析判斷
         */
        private Student student;
        private boolean isName;
        private boolean isAge;
        private boolean isSalary;
    
        
        /***
         * 文檔開始解析  只執行一次
         */
        @Override
        public void startDocument() throws SAXException {
            System.out.println("xml解析開始");
            list=new ArrayList<Student>();
        }
    
        /***
         * 開始標簽   每次讀到一個標簽便從這個方法開始
         */
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        	
        	//qName 讀到的標簽的名稱
            if (qName.equals("student")){
                student=new Student();//讀到student標簽   創建一個學生對象
            }else if (qName.equals("name")){
                isName=true;
            }else if (qName.equals("age")){
                isAge=true;
            }else if (qName.equals("salary")){
                isSalary=true;
            }
    
        }
    
        /***
         * 當讀取到標簽  標簽內有內容  遍執行此方法    獲取標簽的內容
         */
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            String temp=new String(ch,start,length);
            if (isName){
                student.setName(temp);
                isName=false;
            }else if (isAge){
                student.setAge(Integer.valueOf(temp));
                isAge=false;
            }else if (isSalary){
                student.setSalary(Integer.valueOf(temp));
                isSalary=false;
            }
    
        }
    
        /***
         * 每讀到一個結束的標簽   遍執行此方法
         */
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            if (qName.equals("student")){
                list.add(student);//一個student 的標簽讀完   將該學生對象添加到集合中
            }
    
        }
        
        /***
         * 整個xml解析結束  只執行一次
         */
        @Override
        public void endDocument() throws SAXException {
            System.out.println("xml文檔解析結束");  
        }
        
        /***
         * 獲取學生集合對象
         * @return
         */
        public List<Student> getList(){
            return list;
        }
    }

    解析結果:

     

     


    2.2 PULL解析

    PULL解析與SAX解析方式相似,都是事件驅動方式。使用PULL解析需要導入的jar包。

    jar包地址:https://download.csdn.net/download/sitansen/10611364

    /**
     * Pull解析xml
     */
    public class PullTest {
        static List<Student> list;
        static Student student;
        static String tag;//用于存放標簽
        public static void main(String[] args)throws Exception{
    
            //創建解析工廠
            XmlPullParserFactory pullParserFactory=XmlPullParserFactory.newInstance();
            //創建解析器對象
            XmlPullParser pullParser=pullParserFactory.newPullParser();
            //傳入xml文件
            pullParser.setInput(new FileReader("students.xml"));
            //開始解析
            action(pullParser);
            //獲取結果
            for(Student s:list){
                System.out.println("id:"+s.getId()+" ,姓名:"+s.getName()+" ,年齡:"+s.getAge()+" ,工資:"+s.getSalary());
            }
        }
    
        /**
         * 開始解析
         * @param pullParser
         * @throws Exception
         */
        public static void action(XmlPullParser pullParser)throws Exception{
            int eventType=pullParser.getEventType();//獲取標簽類型
            while (eventType!=XmlPullParser.END_DOCUMENT){//END_DOCUMENT 用于判斷是否解析完
                tag=pullParser.getName();//獲取標簽名
                //解析開始
                if (eventType==XmlPullParser.START_DOCUMENT){//START_DOCUMENT 文檔開始的標簽   
                    list=new ArrayList<>();//創建一個list用于存放學生對象
                }else if (eventType==XmlPullParser.START_TAG){   //開始標簽
                    if (tag.equals("student")){
                        student=new Student();
                        /***
                         * 獲取屬性id
                         */
                        int num=pullParser.getAttributeCount();//獲取屬性的個數
                        for (int i=0;i<num;i++){
                            if (pullParser.getAttributeName(i).equals("id")){//判斷屬性名是否為id
                                student.setId(Integer.valueOf(pullParser.getAttributeValue(i)));
                                break;
                            }
                        }
                    }else if (tag.equals("name")){
                        student.setName(pullParser.nextText());//調用nextText()方法過去name標簽后的內容  以下同
                    }else if (tag.equals("age")){
                        student.setAge(Integer.valueOf(pullParser.nextText()));
                    }else if (tag.equals("salary")){
                        student.setSalary(Integer.valueOf(pullParser.nextText()));
                    }
                }else if (eventType==XmlPullParser.END_TAG){ //student標簽結束 
                    if (tag.equals("student")){
                        list.add(student);//將當前的學生對象存起來
                    }
                }
                eventType=pullParser.next();//獲取下一個標簽的類型
            }
        }
    }
    

    解析結果:

     


    2.3DOM解析

    DOM解析與前兩種方式不同,DOM解析采用的是將整個XML文件讀取進來,再組成一個DOM樹。根據節點與節點之間的關系來解析XML。適用于小文件的解析,大文件用DOM解析會照成資源占用過大。

    /***
     * 利用DOM 解析student.xml
     *
     */
    public class MyDomTest {
    	public static void main(String[] args) throws Exception{
    		
    		//創建一個工廠
    		DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
    		//創建對象
    		DocumentBuilder db=dbf.newDocumentBuilder();
    		//加載xml文件
    		Document document=db.parse("students.xml");
    		//獲取student節點的集合
    		NodeList nodeList=document.getElementsByTagName("student");
    		System.out.println("共有學生"+nodeList.getLength()+"人");
    		//遍歷student節點集合
    		for(int i=0;i<nodeList.getLength();i++) {
    			System.out.println("----------第"+(i+1)+"個學生的信息----------");
    			//通過item方法返回集合中的第i個項
    			Node node=nodeList.item(i);
    			//獲取當前節點的屬性集合
    			NamedNodeMap attrs=node.getAttributes();
    			for(int j=0;j<attrs.getLength();j++) {
    				Node a=attrs.item(j);
    				System.out.println("屬性:"+a.getNodeName()+"\t值:"+a.getNodeValue());
    			}
    			
    			//解析student的子節點
    			NodeList childNode=node.getChildNodes();
    			//遍歷子節點
    			for(int k=0;k<childNode.getLength();k++) {
    				if (childNode.item(k).getNodeType()==Node.ELEMENT_NODE) {
    					System.out.print("節點名:"+childNode.item(k).getNodeName());
    					System.out.print("\t值:"+childNode.item(k).getFirstChild().getNodeValue()+"\n");
    					
    				}
    			}
    			
    		}
    		System.out.println("解析結束");
    	}
    }

    解析結果:

     

     

    版權聲明:本文為sitansen原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/sitansen/article/details/81782544

    智能推薦

    XML解析器:DOM、SAX、DOM4J

    ※ XML學習 W3CSchool.chm文件 W3CSchool.chm.zip ※ XML解析器 JAXP介紹(Java API for XMLProcessing) JAXP 是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包組成. 在 javax.xml.parsers 包中,定義了幾個工廠類,程序員調用這些工廠類,可以得到對xml文檔...

    Java 解析 xml 常見的4中方式:DOM SAX JDOM DOM4J

    Java 四種解析 XML 的特點 1、DOM 解析: 形成了樹結構,有助于更好的理解、掌握,且代碼容易編寫。 解析過程中,樹結構保存在內存中,方便修改。 2、SAX 解析: 采用事件驅動模式,對內存耗費比較小。 適用于只處理 XML 文件中的數據時 3、JDOM 解析: 僅使用具體類,而不使用接口。 API 大量使用了 Collections 類。 4、DOM4J 解析: JDOM 的一種智能分...

    XML文檔解析技術之SAX解析與DOM解析

    一、SAX解析              SAX解析xml的方式是一種快速解析xml文檔的手段,優點是效率高,適用于解析量不大的xml文檔。              使用案例: 使用sax的方式將如下的xml文檔的用戶信息解析出來。   ...

    XML(三):xml的解析技術:dom和sax

    1. 解析過程圖及優缺點 2.針對dom和sax的解析器 3.JAXP 使用 1)javax.xml.parsers包下有四個類: DocumentBuilder和DocumentBuilderFactory、 SaxParser和SaxParserFactory 2)步驟:...

    XML介紹及DOM解析&SAX解析——學習筆記

    目錄 一、XML簡介 (1)XML和HTML (2)什么是XML 二、XML元素VS節點 三、DOM方式解析XML原理 四、SAX方式解析XML原理 五、JDOM工具解析 六、DOM4J工具解析 一、XML簡介 (1)XML和HTML          XML   被設計用來傳輸和存儲數據。 &nb...

    猜你喜歡

    XML的SAX解析以及DOM解析和SAX解析區別

    前言: XML解析工具 老樣子,三個問題: SAX是什么? 也是用來解析XML的 SAX解析工具- 內置在jdk中。org.xml.sax.* SAX運用場景? SAX解析原理: 加載一點,讀取一點,處理一點。對內存要求比較低。 SAX解析工具核心: 核心的API: 參數一: File:表示 讀取的xml文件。 參數二: DefaultHandler: SAX事件處理程序。使用DefaultHan...

    JAVA SAX解析XML文檔

    SAX SAX(simple API for XML)是一種XML解析的方法,相比于DOM,SAX的解析更有效更快。 解析步驟 ①獲取解析工廠 ②從解析工廠獲取解析容器 ③編寫處理器 ④加載Document處理器 ⑤進行解析 詳細步驟 ①此解析模式使用了工廠設計模式,所以先需獲取工廠 工廠全路徑為:javax.xml.parsers.SAXParserFactory 另外還使用了單例設計模式,所以...

    java解析xml(sax方式)

    SAX的方式,大致步驟: 以下為查看相關所關聯的class: 在SAXParserImpl中的 1、 先調用父類SAXParser的parse(String uri, DefaultHandler dh) 它的邏輯代碼: 2、 再執行父類的 parse(InputSource is, DefaultHandler dh) 邏輯代碼為: XMLReader reader = JAXPSAXParse...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    精品国产乱码久久久久久蜜桃不卡