99久久精品国产片-99久久精品国产免费-99久久精品国产麻豆-99久久精品国产国产毛片-99久久精品国产高清一区二区-99久久精品费精品国产一区二区

你所不知道的XML

2020-5-6    前端達人

一、XML:

XML(Extensible Markup Language 可擴展標記語言),XML是一個以文本來描述數據的文檔。

1. 示例:

<?xml version="1.0" encoding="UTF-8"?>
<people>
    <person personid="E01">
        <name>Tony</name>
        <address>10 Downing Street, London, UK</address>
        <tel>(061) 98765</tel>
        <fax>(061) 98765</fax>
        <email>tony@everywhere.com</email>
    </person>
    <person personid="E02">
        <name>Bill</name>
        <address>White House, USA</address>
        <tel>(001) 6400 98765</tel>
        <fax>(001) 6400 98765</fax>
        <email>bill@everywhere.com</email>
    </person>
</people>

2. 用途:

(1)充當顯示數據(以XML充當顯示層)

(2)存儲數據(存儲層)的功能

(3)以XML描述數據,并在聯系服務器與系統的其余部分之間傳遞。(傳輸數據的一樣格式)

從某種角度講,XML是數據封裝和消息傳遞技術。

3.解析XML:
3.1 :使用SAX解析XML

3.1.1 什么是SAX:

SAX是Simple API for XML的縮寫
SAX 是讀取和操作 XML 數據更快速、更輕量的方法。SAX 允許您在讀取文檔時處理它,從而不必等待整個文檔被存儲之后才采取操作。它不涉及 DOM 所必需的開銷和概念跳躍。 SAX API是一個基于事件的API ,適用于處理數據流,即隨著數據的流動而依次處理數據。SAX API 在其解析您的文檔時發生一定事件的時候會通知您。在您對其響應時,您不作保存的數據將會被拋棄。

3.1.2 SAX解析XML方式:

SAX API中主要有四種處理事件的接口,它們分別是ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler 。實際上只要繼承DefaultHandler 類就可以,DefaultHandler實現了這四個事件處理器接口,然后提供了每個抽象方法的默認實現。
// 創建SAX解析器工廠對象
SAXParserFactory spf = SAXParserFactory.newInstance();
// 使用解析器工廠創建解析器實例
SAXParser saxParser = spf.newSAXParser();
// 創建SAX解析器要使用的事件偵聽器對象
PersonHandler handler = 
                         new PersonHandler();
// 開始解析文件
saxParser.parse(
            new File(fileName), handler);


3.2. DOM解析XML:

DOM:Document Object Model(文檔對象模型)
DOM的特性:
定義一組 Java 接口,基于對象,與語言和平臺無關將 XML 文檔表示為樹,在內存中解析和存儲 XML 文檔,允許隨機訪問文檔的不同部分。

DOM解析XML
DOM的優點,由于樹在內存中是持久的,因此可以修改后更新。它還可以在任何時候在樹中上下導航,API使用起來也較簡單。 

DocumentBuilderFactory builder = DocumentBuilderFactory.newInstance();
DocumentBuilder db = builder.newDocumentBuilder();
db.parse("person.xml");
NodeList node_person = doc.getElementsByTagName("person");

 3.3. JDOM解析XML:

JDOM是兩位著名的 Java 開發人員兼作者,Brett Mclaughlin 和 Jason Hunter 的創作成果, 2000 年初在類似于Apache協議的許可下,JDOM作為一個開放源代碼項目正式開始研發了。

JDOM 簡化了與 XML 的交互并且比使用 DOM 實現更快,JDOM 與 DOM 主要有兩方面不同。首先,JDOM 僅使用具體類而不使用接口。這在某些方面簡化了 API,但是也限制了靈活性。第二,API 大量使用了 Collections 類,簡化了那些已經熟悉這些類的 Java 開發者的使用。
 

解析步驟:
(1)SAXBuilder sax = new SAXBuilder();
(2)Document doc = sax.build(….);
(3)Element el = doc.getRootElement();(4)List list = el.getChildren();
(5)遍歷內容


3.4. DOM4J解析XML:

dom4j是一個非常非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件,可以在SourceForge上找到它。在對主流的Java XML API進行的性能、功能和易用性的評測,dom4j無論在那個方面都是非常出色的。如今你可以看到越來越多的Java軟件都在使用dom4j來讀寫XML,特別值得一提的是連Sun的JAXM也在用dom4j。這是必須使用的jar包, Hibernate用它來讀寫配置文件。
解析步驟:
(1)SAXReader sax = new SAXReader();
(2)Document doc = sax.read(Thread.currentThread().getContextClassLoader()
          .getResourceAsStream("person.xml"));
(3)Element root = doc.getRootElement();
(4)Iterator iterator = root.elementIterator();
(5)遍歷迭代器


4.各種解析方法比較:
JDOM 和 DOM 在性能測試時表現不佳,在測試 10M 文檔時內存溢出。
SAX表現較好,這要依賴于它特定的解析方式。一個 SAX 檢測即將到來的XML流,但并沒有載入到內存(當然當XML流被讀入時,會有部分文檔暫時隱藏在內存中。DOM4J是這場測試的獲勝者,目前許多開源項目中大量采用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 來讀取 XML 配置文件。
xstream 實現XML的轉換


5.案例:

public class Person {
    private String personid;
    private String name;
    private String address;
    private String tel;
    private String fax;
    private String email;

    @Override
    public String toString() {
        return "Person{" +
                "personid='" + personid + '\'' +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", tel='" + tel + '\'' +
                ", fax='" + fax + '\'' +
                ", email='" + email + '\'' +
                '}';
    }

    public String getPersonid() {
        return personid;
    }

    public void setPersonid(String personid) {
        this.personid = personid;
    }

    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 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 getEmail() {
        return email;
    }

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



<?xml version="1.0" encoding="UTF-8"?>
<people>
    <person personid="E01">
        <name>Tony Blair</name>
        <address>10 Downing Street, London, UK</address>
        <tel>(061) 98765</tel>
        <fax>(061) 98765</fax>
        <email>blair@everywhere.com</email>
    </person>
    <person personid="E02">
        <name>Bill Clinton</name>
        <address>White House, USA</address>
        <tel>(001) 6400 98765</tel>
        <fax>(001) 6400 98765</fax>
        <email>bill@everywhere.com</email>
    </person>
</people>


import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Hu Guanzhong
 * SAX解析的特點:
 * 1、基于事件驅動
 * 2、順序讀取,速度快
 * 3、不能任意讀取節點(靈活性差)
 * 4、解析時占用的內存小
 * 5、SAX更適用于在性能要求更高的設備上使用(Android開發中)
 *
 */
public class PersonHandler extends DefaultHandler{
    private List<Person> persons = null;
    private Person p;//當前正在解析的person
    private String tag;//用于記錄當前正在解析的標簽名

    public List<Person> getPersons() {
        return persons;
    }

    //開始解析文檔時調用
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        persons = new ArrayList<>();
        System.out.println("開始解析文檔...");
    }

    //在XML文檔解析結束時調用
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        System.out.println("解析文檔結束.");
    }

    /**
     * 解析開始元素時調用
     * @param uri 命名空間
     * @param localName 不帶前綴的標簽名
     * @param qName 帶前綴的標簽名
     * @param attributes 當前標簽的屬性集合
     * @throws SAXException
     */
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        if ("person".equals(qName)){
            p = new Person();
            String personid = attributes.getValue("personid");
            p.setPersonid(personid);
        }
        tag = qName;
        System.out.println("startElement--"+qName);
    }

    //解析結束元素時調用
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        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 {
        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);
        }
    }
}



public class XMLDemo {

    /**
     * 使用第三方xstream組件實現XML的解析與生成
     */
    @Test
    public void xStream(){
        Person p = new Person();
        p.setPersonid("1212");
        p.setAddress("北京");
        p.setEmail("vince@163.com");
        p.setFax("6768789798");
        p.setTel("13838389438");
        p.setName("38");

        XStream xStream = new XStream(new Xpp3Driver());
        xStream.alias("person",Person.class);
        xStream.useAttributeFor(Person.class,"personid");
        String xml = xStream.toXML(p);
        System.out.println(xml);

        //解析XML
        Person person = (Person)xStream.fromXML(xml);
        System.out.println(person);
    }

    /**
     * 從XML文件中讀取對象
     */
    @Test
    public void xmlDecoder() throws FileNotFoundException {
        BufferedInputStream in = new BufferedInputStream(new FileInputStream("test.xml"));
        XMLDecoder decoder = new XMLDecoder(in);
        Person p = (Person)decoder.readObject();
        System.out.println(p);
    }
    /**
     * 把對象轉成XML文件寫入
     */
    @Test
    public void xmlEncoder() throws FileNotFoundException {
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.xml"));
        XMLEncoder xmlEncoder = new XMLEncoder(bos);
        Person p = new Person();
        p.setPersonid("1212");
        p.setAddress("北京");
        p.setEmail("vince@163.com");
        p.setFax("6768789798");
        p.setTel("13838389438");
        p.setName("38");
        xmlEncoder.writeObject(p);
        xmlEncoder.close();
    }

    /**
     * DOM4J解析XML
     * 基于樹型結構,第三方組件
     * 解析速度快,效率更高,使用的JAVA中的迭代器實現數據讀取,在WEB框架中使用較多(Hibernate)
     *
     */
    @Test
    public void dom4jParseXML() throws DocumentException {
        //1 創建DOM4J的解析器對象
        SAXReader reader = new SAXReader();
        InputStream is = Thread.currentThread().getContextClassLoader()
                .getResourceAsStream("com/vince/xml/person.xml");
        org.dom4j.Document doc = reader.read(is);
        org.dom4j.Element rootElement = doc.getRootElement();
        Iterator<org.dom4j.Element> iterator = rootElement.elementIterator();
        ArrayList<Person> persons = new ArrayList<>();
        Person p = null;
        while(iterator.hasNext()){
            p = new Person();
            org.dom4j.Element e = iterator.next();
            p.setPersonid(e.attributeValue("personid"));
            Iterator<org.dom4j.Element> iterator1 = e.elementIterator();
            while(iterator1.hasNext()){
                org.dom4j.Element next = iterator1.next();
                String tag = next.getName();
                if("name".equals(tag)){
                    p.setName(next.getText());
                }else if("address".equals(tag)){
                    p.setAddress(next.getText());
                }else if("tel".equals(tag)){
                    p.setTel(next.getText());
                }else if("fax".equals(tag)){
                    p.setFax(next.getText());
                }else if("email".equals(tag)){
                    p.setEmail(next.getText());
                }
            }
            persons.add(p);
        }
        System.out.println("結果:");
        System.out.println(Arrays.toString(persons.toArray()));
    }

    /**
     * JDOM解析 XML
     * 1、與DOM類似基于樹型結構,
     * 2、與DOM的區別:
     * (1)第三方開源的組件
     * (2)實現使用JAVA的Collection接口
     * (3)效率比DOM更快
     */
    @Test
    public void jdomParseXML() throws JDOMException, IOException {
        //創建JDOM解析器
        SAXBuilder builder = new SAXBuilder();
        InputStream is = Thread.currentThread().getContextClassLoader()
                .getResourceAsStream("com/vince/xml/person.xml");
        org.jdom2.Document build = builder.build(is);
        Element rootElement = build.getRootElement();
        List<Person> list = new ArrayList<>();
        Person person = null;
        List<Element> children = rootElement.getChildren();
        for(Element element: children){
            person = new Person();
            String personid = element.getAttributeValue("personid");
            person.setPersonid(personid);
            List<Element> children1 = element.getChildren();
            for (Element e: children1){
                String tag = e.getName();
                if("name".equals(tag)){
                    person.setName(e.getText());
                }else if("address".equals(tag)){
                    person.setAddress(e.getText());
                }else if("tel".equals(tag)){
                    person.setTel(e.getText());
                }else if("fax".equals(tag)){
                    person.setFax(e.getText());
                }else if("email".equals(tag)){
                    person.setEmail(e.getText());
                }
            }
            list.add(person);
        }
        System.out.println("結果:");
        System.out.println(Arrays.toString(list.toArray()));
    }

    /**
     * DOM解析XML
     * 1、基于樹型結構,通過解析器一次性把文檔加載到內存中,所以會比較占用內存,可以隨機訪問
     * 更加靈活,更適合在WEB開發中使用
     */
    @Test
    public void domParseXML() throws ParserConfigurationException, IOException, SAXException {
        //1、創建一個DOM解析器工廠對象
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //2、通過工廠對象創建解析器對象
        DocumentBuilder documentBuilder = factory.newDocumentBuilder();
        //3、解析文檔
        InputStream is = Thread.currentThread().getContextClassLoader()
                .getResourceAsStream("com/vince/xml/person.xml");
        //此代碼完成后,整個XML文檔已經被加載到內存中,以樹狀形式存儲
        Document doc = documentBuilder.parse(is);
        //4、從內存中讀取數據

        //獲取節點名稱為person的所有節點,返回節點集合
        NodeList personNodeList = doc.getElementsByTagName("person");
        ArrayList<Person> persons = new ArrayList<>();
        Person p = null;
        //此循環會迭代兩次
        for (int i=0;i<personNodeList.getLength();i++){
            Node personNode = personNodeList.item(i);
            p = new Person();
            //獲取節點的屬性值
            String personid = personNode.getAttributes().getNamedItem("personid").getNodeValue();
            p.setPersonid(personid);
            //獲取當前節點的所有子節點
            NodeList childNodes = personNode.getChildNodes();
            for (int j = 0;j<childNodes.getLength();j++){
                Node item = childNodes.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("tel".equals(nodeName)){
                    p.setTel(item.getFirstChild().getNodeValue());
                }else if("fax".equals(nodeName)){
                    p.setFax(item.getFirstChild().getNodeValue());
                }else if("email".equals(nodeName)){
                    p.setEmail(item.getFirstChild().getNodeValue());
                }
            }
            persons.add(p);
        }
        System.out.println("結果:");
        System.out.println(Arrays.toString(persons.toArray()));
    }

    /**
     * SAX解析的特點:
     * 1、基于事件驅動
     * 2、順序讀取,速度快
     * 3、不能任意讀取節點(靈活性差)
     * 4、解析時占用的內存小
     * 5、SAX更適用于在性能要求更高的設備上使用(Android開發中)
     * @throws ParserConfigurationException
     * @throws SAXException
     * @throws IOException
     */
    @Test
    public void saxParseXML() throws ParserConfigurationException, SAXException, IOException {
        //1、創建一個SAX解析器工廠對象
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
        //2、通過工廠對象創建SAX解析器
        SAXParser saxParser = saxParserFactory.newSAXParser();
        //3、創建一個數據處理器(需要我們自己來編寫)
        PersonHandler personHandler = new PersonHandler();
        //4、開始解析
        InputStream is = Thread.currentThread().getContextClassLoader()
                .getResourceAsStream("com/vince/xml/person.xml");
        saxParser.parse(is,personHandler);
        List<Person> persons = personHandler.getPersons();
        for (Person p:persons){
            System.out.println(p);
        }
    }
}

日歷

鏈接

個人資料

藍藍設計的小編 http://www.lapeinture.cn

存檔

久久精品免视看国产明星| 国产成人精品综合在线| 午夜在线影院| 国产不卡在线观看| 久久福利影视| 午夜欧美成人久久久久久| 尤物视频网站在线观看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 欧美一级视频免费观看| 欧美大片a一级毛片视频| 精品在线观看国产| 久久国产精品永久免费网站| 欧美大片一区| 欧美一级视频免费| 国产韩国精品一区二区三区| 99热精品一区| 国产福利免费视频| 国产成人精品在线| 四虎影视库国产精品一区| 午夜在线亚洲| 日本乱中文字幕系列| 欧美一级视频免费观看| 欧美激情一区二区三区视频| 亚洲精品永久一区| 日本特黄特色aaa大片免费| 国产视频一区在线| 亚洲第一色在线| 日本在线www| 亚洲精品永久一区| 国产网站免费视频| 韩国三级视频在线观看| 亚洲天堂在线播放| 色综合久久天天综合| 国产不卡精品一区二区三区| 精品在线免费播放| 成人在激情在线视频| 国产视频久久久| 精品视频一区二区三区| 欧美激情一区二区三区中文字幕| 四虎影视久久久| 精品在线免费播放| 日本特黄特色aaa大片免费| 国产福利免费观看| 国产成人女人在线视频观看| 麻豆系列国产剧在线观看| 日本伦理黄色大片在线观看网站| 九九精品久久| 国产一区免费观看| 欧美1卡一卡二卡三新区| 国产麻豆精品高清在线播放| 国产一区二区高清视频| 精品国产一区二区三区久久久狼| 成人高清视频免费观看| 亚洲天堂免费观看| a级毛片免费观看网站| 亚欧视频在线| 99久久精品国产片| 日日夜人人澡人人澡人人看免| 亚洲精品影院| 欧美1卡一卡二卡三新区| 国产一区二区精品尤物| 日本免费看视频| 久久国产影院| 久久国产精品只做精品| 国产激情一区二区三区| 999精品在线| 成人影院久久久久久影院| 午夜久久网| 99久久精品国产麻豆| 韩国三级香港三级日本三级la| 99色视频在线观看| 日韩一级黄色片| 午夜精品国产自在现线拍| 国产高清视频免费观看| 日韩中文字幕在线亚洲一区| 欧美爱爱动态| 人人干人人草| 国产国产人免费视频成69堂| 毛片成人永久免费视频| 亚欧成人毛片一区二区三区四区| 国产视频一区二区在线观看| 精品视频免费观看| 四虎论坛| 91麻豆tv| 午夜久久网| 国产麻豆精品| 精品视频免费观看| 久久国产精品自由自在| 99热精品在线| 国产伦精品一区三区视频| 国产网站麻豆精品视频| 精品久久久久久免费影院| 国产一区精品| 国产91丝袜在线播放0| 精品久久久久久中文字幕一区 | 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产精品123| 青青久在线视频| 国产亚洲男人的天堂在线观看| 精品在线免费播放| 亚洲精品中文字幕久久久久久| 国产一区二区精品| 日本特黄特黄aaaaa大片| 美女免费毛片| 日本特黄一级| 黄视频网站在线看| 欧美激情一区二区三区视频| 精品国产一区二区三区免费| 亚洲精品永久一区| 国产精品自拍在线观看| 久久国产精品只做精品| 国产91素人搭讪系列天堂| 一级毛片看真人在线视频| 日本特黄特黄aaaaa大片| 国产综合91天堂亚洲国产| 成人影视在线播放| 天天做人人爱夜夜爽2020| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 欧美a级片视频| 九九免费高清在线观看视频| 亚洲精品影院| 免费一级生活片| 你懂的在线观看视频| 久久福利影视| 美女免费黄网站| 韩国毛片 免费| 99久久精品国产国产毛片| 美国一区二区三区| 国产伦理精品| 国产一区二区精品久| 欧美18性精品| 欧美电影免费| 免费一级生活片| 一本伊大人香蕉高清在线观看| 毛片成人永久免费视频| 在线观看成人网 | 亚洲天堂免费| 欧美电影免费| a级精品九九九大片免费看| 欧美大片毛片aaa免费看| 亚欧视频在线| 一级毛片看真人在线视频| 可以免费看毛片的网站| 精品国产一区二区三区久久久蜜臀| 免费的黄视频| 成人a大片在线观看| 国产一区二区精品在线观看| 亚洲天堂免费观看| 久久99欧美| 国产视频一区二区在线播放| 久草免费在线视频| 久久国产精品永久免费网站| 一级毛片视频免费| 黄色福利| 日韩一级黄色| 国产成人精品综合久久久| 一级女性全黄生活片免费| 欧美a级成人淫片免费看| 91麻豆精品国产自产在线观看一区| 九九久久99综合一区二区| 香蕉视频久久| 免费一级生活片| 午夜家庭影院| 日本特黄特色aaa大片免费| 麻豆系列国产剧在线观看| 国产a网| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 免费一级片网站| 99色精品| 欧美日本韩国| 亚欧视频在线| 亚洲女人国产香蕉久久精品| 国产精品自拍在线观看| 成人高清免费| 亚洲精品影院久久久久久| 日韩在线观看视频免费| 午夜在线亚洲| 国产美女在线一区二区三区| 亚洲精品影院| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产视频网站在线观看| 91麻豆国产级在线| 成人在激情在线视频| 色综合久久天天综合绕观看| 91麻豆国产级在线| 成人a级高清视频在线观看| 久久久久久久网| 精品国产一区二区三区免费| 成人免费网站久久久| 亚洲精品中文一区不卡| 精品在线免费播放| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 青青久在线视频| 99久久精品国产国产毛片| 黄视频网站在线看| 香蕉视频久久| 毛片电影网| 国产成人精品在线| 麻豆午夜视频| 尤物视频网站在线观看|