Xml文件之解析

這裏寫圖片描述
XML之Sax(simple api for xml )解析:

主實現類:

package com.xml;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.junit.Test;
import org.xml.sax.SAXException;
/*
 * Sex解析的特點:
 * 1.基於事件的讀取
 * 2.基於順序的讀取,速度快
 * 3.不能任意讀取節點(靈活性差一些)
 * 4.sex更適用於在要求跟高的設備上使用(Android開發中);
 * 5.解析時佔用內存小
 */
public class ImplementsXML {

    @Test
    public static void saxparsemxl() {
        //1.創建一個sax解析工廠對象
        SAXParserFactory spf=SAXParserFactory.newInstance();
        //2.通過工廠對象創建sax解析器
        try {

         SAXParser sp=  spf.newSAXParser();
         //3.創建一個數據處理器(需要我們自己來編寫)
        dataParser dp=new dataParser();
        //4.開啓解析
        InputStream is= Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xml/NewFile.xml");

        try {
            //參數一輸入文件字節流 /參數二 自己編寫的數據處理器
            sp.parse(is,dp);
        ArrayList<person>   p=dp.getPersons();
        //通過for循環輸出對象   
        for(person p1:p) {
                System.out.println(p1);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



    }

    public static void main(String[] args) {
        //調用解析xml的方法
        saxparsemxl();
    }
}

數據處理器類:

package com.xml;
import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class dataParser extends DefaultHandler {
    private ArrayList<person> persons=new ArrayList<person>();
    private person p;//當前正在解析的person對象
    private String tag;//用於記錄正在解析的標籤名

    public ArrayList<person> getPersons() {
        return persons;
    }

    @Override
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub
        super.startDocument();
        ;
        System.out.println("開啓解析文檔>>>>>>>>>");
    }

    @Override
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub
        super.endDocument();
        System.out.println("文檔解析結束.");
    }
    //解析開始元素時調用
    /*
     * String 命名空間, String 不帶前綴的標籤名字, String 不帶前綴的標籤名字, Attributes 當前標籤的屬性集合
     */
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        super.startElement(uri, localName, qName, attributes);
        //表示解析到了person標籤
        if("person".equals(qName)) {
            p=new person();
            String id=attributes.getValue("person");
            //設置id
            p.setId(id);
        }
        tag=qName;
        System.out.println("startElement"+qName);
    }
    //解析結束元素時調用
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        // TODO Auto-generated method stub
        super.endElement(uri, localName, qName);
        if("person".equals(qName)) {
            persons.add(p);
            tag=null;
        }
        System.out.println("endElement"+qName);
    }
    //解析文本時調用

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        // TODO Auto-generated method stub
        super.characters(ch, start, length);
        if(tag !=null) {
            if("name".equals(tag)){
                p.setName(new String(ch,start,length));
            }else if("address".equals(tag)) {
                p.setAddress(new String (ch,start,length));
            }else if("tel".equals(tag)) {
                p.setTel(new String (ch,start,length));
            }else if("fax".equals(tag)) {
                p.setFax(new String (ch,start,length));
            }else if("email".equals("tag")) {
                p.setEmail(new String (ch,start,length));
            }
        }
        System.out.println(ch);
    }


}

解析的對象person類

package com.xml;

public class person {

    private String name;
    private String address;
    private String email;
    private String tel;
    private String fax;
    private String id;

    public person() {
        super();
        // TODO Auto-generated constructor stub
    }

    public person(String name, String address, String email, String tel, String fax, String id) {
        super();
        this.name = name;
        this.address = address;
        this.email = email;
        this.tel = tel;
        this.fax = fax;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public String getFax() {
        return fax;
    }

    public void setFax(String fax) {
        this.fax = fax;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "person [name=" + name + ", address=" + address + ", email=" + email + ", tel=" + tel + ", fax=" + fax
                + ", id=" + id + "]";
    }

}

xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<persion>
    <person id="p1">
            <name>小紅</name>
            <address>上海</address>
            <tel>100886</tel>
            <fax>001100</fax>
            <email>[email protected]</email>
    </person> 

    <person id="p2">
            <name>小明</name>
            <address>上海</address>
            <tel>189886</tel>
            <fax>011110</fax>
            <email>[email protected]</email>
    </person>
</persion>

XML之Dom(document Object Modo)解析:

package com.xml;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/*
 * DOM解析mxl
 * 1.基於樹形結構,通過解析器一次性把文檔加載到內存中,
 * 會比較佔用內存,可以隨機訪問,跟適用於web開發中使用
 */
public class domeParserXml {

    public static void parset() {
        //1.創建一個dom解析器工廠
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        //2.通過工廠對象創建解析器對象

        //4.從內存中讀取數據
        try {
            DocumentBuilder db=factory.newDocumentBuilder();
        //3.解析文檔
            InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xml/NewFile.xml");
            try {
        //此代碼執行後整個xml已經加載到內存當中,以樹狀形式存儲  
        Document doc=db.parse(is);//通過解析器進行解析
        //返回一個NodeList節點
        person p=null;
        NodeList  nl=doc.getElementsByTagName("person");        
            ArrayList<person> persons=new ArrayList<>();
            //遍歷NodeList節點
            //獲取屬性值
            for(int i=0;i<nl.getLength();i++) {
                Node personNode=nl.item(i);
                p=new person();
            String   s=personNode.getAttributes().getNamedItem("id").getNodeValue();
            p.setId(s);
            //獲取當前節點的所有子節點
        NodeList childNodel=doc.getChildNodes();
            for(int j=0;j<childNodel.getLength();j++) {
            Node item=childNodel.item(j);
            String nodename=item.getNodeName();
            if("name".equals(nodename)) {
                p.setName(item.getFirstChild().getNodeValue());
            }else if("address".equals(nodename)) {
                p.setAddress(item.getFirstChild().getNodeValue());

            }else if("email".equals(nodename)) {
                p.setEmail(item.getFirstChild().getNodeValue());
            }else if("fax".equals(nodename)) {
                p.setFax(item.getFirstChild().getNodeValue());
            }else if("tel".equals(nodename)) {
                p.setTel(item.getFirstChild().getNodeValue());
            }
            persons.add(p);
            }
            for(person person:persons) {
                System.out.println(person);
            }

            }
            } catch (SAXException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }   
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

    public static void main(String[] args) {
        parset();

    }
}

XML之JDom(java document Object Modo)解析:

package com.xml;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
/*
 * JDOM解析 xml
 * 1.於dom類似,都是基於樹形結構
 * 2.於dom的區別
 *  (1)第三方開源的組件
 *  (2)實現使用java的collection接口
 *  (3)效率比DOM更快
 * 
 */
public class JDomParserXml {

    public static void parser() {
        //創建JDOM解析器
        //注意他不是SAX,只是名字叫SAX
        SAXBuilder sb=new SAXBuilder();
        InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xml/NewFile.xml");
        try {
            //開始解析
        Document    build=sb.build(is);
        //獲取根節點
        Element rootelemnt =build.getRootElement();
            List<person> list=new ArrayList<>();
            person person=null;
        //根節點根節點獲取子元素:返回list person對象集合
            List<Element> childList=rootelemnt.getChildren();
            for(Element element:childList ) {
                person=new person();
                String id=element.getAttributeValue("id");
                person.setId(id);
            List<Element> ChildrenList= element.getChildren();
                for(Element e:ChildrenList ) {
                    //取到標籤名字
                    String tag=e.getName();
                    if("name".equals(tag)) {
                        person.setName(e.getText());

                    }else if("address".equals(tag)) {
                        person.setAddress(e.getText());
                    }else if("email".equals(tag)) {
                        person.setEmail(e.getText());
                    }else if("fax".equals(tag)) {
                        person.setFax(e.getText());
                    }else if("tel".equals(tag)) {
                        person.setTel(e.getText());
                    }
                }

                list.add(person);
            }

            for(person p:list) {
                System.out.println(p);
            }
        } catch (JDOMException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        parser();
    }

}

XML之Dom4J(document Object Modo for java)解析:

注意4j不念4,而是讀for

package com.xml;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/*
 * JDOM解析 xml
 * 1.於DOM,都是基於樹形結構
 * 2.於第三方開源的組件,效率比DOM更快
 * 3.JDOM和DOM在性能測試時性能表示不加,在測試10m文檔時內存溢出
 * SAX表現較好,這事依賴與它的解析特性
 * DOM4J是這場測試的獲勝者
 */
public class dom4jparser {

    public static void parser() throws IOException {

        //創建DOM4j解析器
        SAXReader reader=new SAXReader();
        InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xml/NewFile.xml");
        try {
            //返回 DOM4j包中的的 document對象
            Document dc=reader.read(is);
            Element rootelement=dc.getRootElement();
            //獲取迭代器
        Iterator<Element> iterator=rootelement.elementIterator();
            ArrayList<person> personList=new ArrayList<>();
            person p=null;
            //循環素如
            while(iterator.hasNext()) {
                p=new person();
                Element e=iterator.next();
                p.setId(e.attributeValue("id"));
                //Iterator<Element> iterator1 = null;
                while(iterator.hasNext()) {
                    Element name=iterator.next();
                    String tag=name.getName();
                    if("name".equals(tag)) {
                        p.setName(name.getText());
                    }else if("address".equals(tag)) {
                        p.setAddress(name.getText());
                    }else if("email".equals(tag)) {
                        p.setEmail(name.getText());
                    }else if("fax".equals(tag)) {
                        p.setFax(name.getText());
                    }else if("tel".equals(tag)) {
                        p.setTel(name.getText());
                    }
                }
                personList.add(p);

            }
            for(person pp:personList) {
                System.out.println(pp);
            }

        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {

        try {
            parser();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

XmlDecoder和XmlEncoder解析xml文件

package com.xml;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class xmlDome {
//**************************XML編碼方法***************************
    public static void xmlEnCoder() {
        OutputStream out = null;
        try {
            out = new FileOutputStream("C:\\Users\\龍布天下\\Desktop\\long.xml");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        BufferedOutputStream bos=new BufferedOutputStream(out);
        //創建編碼器
        XMLEncoder xmlEncoder=new XMLEncoder(out);
        person p=new person();
        p.setName("小亮");
        p.setAddress("上海");
        p.setEmail("[email protected]");
        p.setFax("05112");
        p.setTel("100990");
        p.setId("01");
        xmlEncoder.writeObject(p);
        xmlEncoder.close();
    }
//**************************XML解碼方法***************************
    public static void xmlDeCoder() {
        InputStream in = null;
        try {
            in = new FileInputStream("C:\\Users\\龍布天下\\Desktop\\long.xml");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        XMLDecoder xmlDecoder=new XMLDecoder(in);
        person p=(person) xmlDecoder.readObject();
        System.out.println(p);
    }

    public static void main(String[] args) {
        //調用編碼方法
        xmlEnCoder();
        //調用解碼方法
        xmlDeCoder();
    }
}

XStream工具解析xml文件

package com.xml;

import com.thoughtworks.xstream.io.xml.Xpp3DomDriver;
/*
 * 使用xStream工具實現XML的解析與生成
 */
public class XStream {

    public static void XStream() {
        person p=new person();
        p.setName("小亮");
        p.setAddress("上海");
        p.setEmail("[email protected]");
        p.setFax("05112");
        p.setTel("100990");
        p.setId("01");
        //創建XPP驅動
        //Xpp3DomDriver xpp=new Xpp3DomDriver();
        com.thoughtworks.xstream.XStream x=new com.thoughtworks.xstream.XStream(new Xpp3DomDriver());
        //根節點取別名
        x.alias("person",person.class);
        //屬性值取別名
        x.useAttributeFor(person.class,"id");
        String s=x.toXML(p);

        System.out.println(s);
        //注意!!!!!!!!!!!!!!!!開始解析;
        //返回person對象
        person person=(com.xml.person) x.fromXML(s);
        System.out.println(person);
    }

    public static void main(String[] args) {
        //調用方法
        XStream();




    }
}

**

xml常用四種解析方式優缺點的分析

**


    xml

      最近用得到xml的解析方式,於是就翻了翻自己的筆記同時從網上查找了資料,自己在前人的基礎上總結了下,貼出來大家分享下。

首先介紹一下xml語言:

可擴展標記語言 (Extensible Markup Language, XML) ,用於標記電子文件使其具有結構性的標記語言,可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。

xml的語法:

XML 分爲兩部分:頭信息,主體信息

頭信息是用來描述 XML 的一些屬性,例如:版本,編碼等,還可以提供 XML 顯示的樣式,和 dtd 編寫格式。

主體信息中包含的是 XML 的具體數據。



頭信息的語法:

<?xml version =”1.0” encoding =”GBK” ?>

其中 version 是必須加的,而 encoding 可以不寫,則默認編碼是 ISO8859-1 ,不支持中文。

除了這個功能外,頭信息還可以進行編寫格式的規定,通過 dtd 或 xsd 文件。

頭信息還支持樣式表的導入,允許通過樣式表控制 XML 的顯示。

這樣可以使用 XML+ CSS 完成頁面的顯示,通過這種形式完成 MVC 中的 View 層:

優點:代碼的安全性很高,可以很容易的替換模板。

缺點:開發成本太高

主體信息 就是由三種節點組成的,節點之間存在父與子的關係,注意的點:

  一個節點只能有一個父節點,如果沒有父節點,該節點稱爲根節點。

  一個節點可以有多個子節點。只有元素節點可以擁有子節點。

  元素節點的標記必須成對出現,或直接結束。

特殊字符必須轉義。依據字符所處的位置是否對 XML 格式造成影響來決定是否進行轉義

根節點只能有一個

xml常用的四種解析方式:

1)DOM(Document Object Model)

文檔對象模型分析方式。以層次結構(類似於樹型)來組織節點和信息片段,映射XML文檔的結構,允許獲取和操作文檔的任意部分。是W3C的官方標準。

優點:
1、允許應用程序對數據和結構做出更改。
2、訪問是雙向的,可以在任何時候在樹中上下導航,獲取和操作任意部分的數據。

缺點:
1、通常需要加載整個XML文檔來構造層次結構,消耗資源大

2)SAX(Simple API for XML)

流模型中的推模型分析方式。通過事件驅動,每發現一個節點就引發一個事件,通過回調方法完成解析工作,解析XML文檔的邏輯需要應用程序完成。

優點:
1、不需要等待所有數據都被處理,分析就能立即開始。
2、只在讀取數據時檢查數據,不需要保存在內存中。
3、可以在某個條件得到滿足時停止解析,不必解析整個文檔。
4、效率和性能較高,能解析大於系統內存的文檔。

缺點:
1、需要應用程序自己負責TAG的處理邏輯(例如維護父/子關係等),使用麻煩。
2、單向導航,很難同時訪問同一文檔的不同部分數據,不支持XPath。

3)JDOM(Java-based Document Object Model)

Java特定的文檔對象模型。自身不包含解析器,使用SAX。

優點:
1、使用具體類而不是接口,簡化了DOM的API。
2、大量使用了Java集合類,方便了Java開發人員。

缺點:
1、沒有較好的靈活性。
2、性能較差。

4)DOM4J(Document Object Model for Java)

簡單易用,採用Java集合框架,並完全支持DOM、SAX和JAXP。

優點:
1、大量使用了Java集合類,方便Java開發人員,同時提供一些提高性能的替代方法。
2、支持XPath。
3、有很好的性能。

缺點:
1、大量使用了接口,API較爲複雜。
發佈了140 篇原創文章 · 獲贊 42 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章