• <noscript id="ggggg"><dd id="ggggg"></dd></noscript>
    <small id="ggggg"></small> <sup id="ggggg"></sup>
    <noscript id="ggggg"><dd id="ggggg"></dd></noscript>
    <tfoot id="ggggg"></tfoot>
  • <nav id="ggggg"><cite id="ggggg"></cite></nav>
    <nav id="ggggg"></nav>
    成人黃色A片免费看三更小说,精品人妻av区波多野结衣,亚洲第一极品精品无码,欧美综合区自拍亚洲综合,久久99青青精品免费观看,中文字幕在线中字日韩 ,亚洲国产精品18久久久久久,黄色在线免费观看

    你所不知道的XML

    2020-5-6    前端達(dá)人

    一、XML:

    XML(Extensible Markup Language 可擴(kuò)展標(biāo)記語言),XML是一個(gè)以文本來描述數(shù)據(jù)的文檔。

    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)充當(dāng)顯示數(shù)據(jù)(以XML充當(dāng)顯示層)

    (2)存儲(chǔ)數(shù)據(jù)(存儲(chǔ)層)的功能

    (3)以XML描述數(shù)據(jù),并在聯(lián)系服務(wù)器與系統(tǒng)的其余部分之間傳遞。(傳輸數(shù)據(jù)的一樣格式)

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

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

    3.1.1 什么是SAX:

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

    3.1.2 SAX解析XML方式:

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


    3.2. DOM解析XML:

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

    DOM解析XML
    DOM的優(yōu)點(diǎn),由于樹在內(nèi)存中是持久的,因此可以修改后更新。它還可以在任何時(shí)候在樹中上下導(dǎo)航,API使用起來也較簡(jiǎn)單。 

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

     3.3. JDOM解析XML:

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

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

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


    3.4. DOM4J解析XML:

    dom4j是一個(gè)非常非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強(qiáng)大和極端易用使用的特點(diǎn),同時(shí)它也是一個(gè)開放源代碼的軟件,可以在SourceForge上找到它。在對(duì)主流的Java XML API進(jìn)行的性能、功能和易用性的評(píng)測(cè),dom4j無論在那個(gè)方面都是非常出色的。如今你可以看到越來越多的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 在性能測(cè)試時(shí)表現(xiàn)不佳,在測(cè)試 10M 文檔時(shí)內(nèi)存溢出。
    SAX表現(xiàn)較好,這要依賴于它特定的解析方式。一個(gè) SAX 檢測(cè)即將到來的XML流,但并沒有載入到內(nèi)存(當(dāng)然當(dāng)XML流被讀入時(shí),會(huì)有部分文檔暫時(shí)隱藏在內(nèi)存中。DOM4J是這場(chǎng)測(cè)試的獲勝者,目前許多開源項(xiàng)目中大量采用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 來讀取 XML 配置文件。
    xstream 實(shí)現(xiàn)XML的轉(zhuǎn)換


    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解析的特點(diǎn):
     * 1、基于事件驅(qū)動(dòng)
     * 2、順序讀取,速度快
     * 3、不能任意讀取節(jié)點(diǎn)(靈活性差)
     * 4、解析時(shí)占用的內(nèi)存小
     * 5、SAX更適用于在性能要求更高的設(shè)備上使用(Android開發(fā)中)
     *
     */
    public class PersonHandler extends DefaultHandler{
        private List<Person> persons = null;
        private Person p;//當(dāng)前正在解析的person
        private String tag;//用于記錄當(dāng)前正在解析的標(biāo)簽名
    
        public List<Person> getPersons() {
            return persons;
        }
    
        //開始解析文檔時(shí)調(diào)用
        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
            persons = new ArrayList<>();
            System.out.println("開始解析文檔...");
        }
    
        //在XML文檔解析結(jié)束時(shí)調(diào)用
        @Override
        public void endDocument() throws SAXException {
            super.endDocument();
            System.out.println("解析文檔結(jié)束.");
        }
    
        /**
         * 解析開始元素時(shí)調(diào)用
         * @param uri 命名空間
         * @param localName 不帶前綴的標(biāo)簽名
         * @param qName 帶前綴的標(biāo)簽名
         * @param attributes 當(dāng)前標(biāo)簽的屬性集合
         * @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);
        }
    
        //解析結(jié)束元素時(shí)調(diào)用
        @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);
        }
    
        //解析文本內(nèi)容時(shí)調(diào)用
        @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組件實(shí)現(xiàn)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文件中讀取對(duì)象
         */
        @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);
        }
        /**
         * 把對(duì)象轉(zhuǎn)成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
         * 基于樹型結(jié)構(gòu),第三方組件
         * 解析速度快,效率更高,使用的JAVA中的迭代器實(shí)現(xiàn)數(shù)據(jù)讀取,在WEB框架中使用較多(Hibernate)
         *
         */
        @Test
        public void dom4jParseXML() throws DocumentException {
            //1 創(chuàng)建DOM4J的解析器對(duì)象
            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("結(jié)果:");
            System.out.println(Arrays.toString(persons.toArray()));
        }
    
        /**
         * JDOM解析 XML
         * 1、與DOM類似基于樹型結(jié)構(gòu),
         * 2、與DOM的區(qū)別:
         * (1)第三方開源的組件
         * (2)實(shí)現(xiàn)使用JAVA的Collection接口
         * (3)效率比DOM更快
         */
        @Test
        public void jdomParseXML() throws JDOMException, IOException {
            //創(chuàng)建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("結(jié)果:");
            System.out.println(Arrays.toString(list.toArray()));
        }
    
        /**
         * DOM解析XML
         * 1、基于樹型結(jié)構(gòu),通過解析器一次性把文檔加載到內(nèi)存中,所以會(huì)比較占用內(nèi)存,可以隨機(jī)訪問
         * 更加靈活,更適合在WEB開發(fā)中使用
         */
        @Test
        public void domParseXML() throws ParserConfigurationException, IOException, SAXException {
            //1、創(chuàng)建一個(gè)DOM解析器工廠對(duì)象
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            //2、通過工廠對(duì)象創(chuàng)建解析器對(duì)象
            DocumentBuilder documentBuilder = factory.newDocumentBuilder();
            //3、解析文檔
            InputStream is = Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream("com/vince/xml/person.xml");
            //此代碼完成后,整個(gè)XML文檔已經(jīng)被加載到內(nèi)存中,以樹狀形式存儲(chǔ)
            Document doc = documentBuilder.parse(is);
            //4、從內(nèi)存中讀取數(shù)據(jù)
    
            //獲取節(jié)點(diǎn)名稱為person的所有節(jié)點(diǎn),返回節(jié)點(diǎn)集合
            NodeList personNodeList = doc.getElementsByTagName("person");
            ArrayList<Person> persons = new ArrayList<>();
            Person p = null;
            //此循環(huán)會(huì)迭代兩次
            for (int i=0;i<personNodeList.getLength();i++){
                Node personNode = personNodeList.item(i);
                p = new Person();
                //獲取節(jié)點(diǎn)的屬性值
                String personid = personNode.getAttributes().getNamedItem("personid").getNodeValue();
                p.setPersonid(personid);
                //獲取當(dāng)前節(jié)點(diǎn)的所有子節(jié)點(diǎn)
                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("結(jié)果:");
            System.out.println(Arrays.toString(persons.toArray()));
        }
    
        /**
         * SAX解析的特點(diǎn):
         * 1、基于事件驅(qū)動(dòng)
         * 2、順序讀取,速度快
         * 3、不能任意讀取節(jié)點(diǎn)(靈活性差)
         * 4、解析時(shí)占用的內(nèi)存小
         * 5、SAX更適用于在性能要求更高的設(shè)備上使用(Android開發(fā)中)
         * @throws ParserConfigurationException
         * @throws SAXException
         * @throws IOException
         */
        @Test
        public void saxParseXML() throws ParserConfigurationException, SAXException, IOException {
            //1、創(chuàng)建一個(gè)SAX解析器工廠對(duì)象
            SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
            //2、通過工廠對(duì)象創(chuàng)建SAX解析器
            SAXParser saxParser = saxParserFactory.newSAXParser();
            //3、創(chuàng)建一個(gè)數(shù)據(jù)處理器(需要我們自己來編寫)
            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);
            }
        }
    }
    

    日歷

    鏈接

    個(gè)人資料

    存檔

    主站蜘蛛池模板: 亚洲不卡在线免费视频| 亚洲国产另类久久久精品小说| 这里只有精品在线观看| 久久久久久综合网天天| 爆乳网站| 黑人巨大亚洲一区二区久| 欧美特黄一免在线观看| 欧美 国产 亚洲 卡通 综合 | 91大神在线精品视频一区 | 四虎地址8848| 免费一区二区三区黄色| 成人午夜精品无码区| 亚洲动漫成人一区二区| 精品欧洲AV无码一区二区男男 | 国产成人无码AV片在线观看不卡 | 欧美成人视频| 国产99视频精品免费专区| 国产精品午夜av福利| 宅男66lu国产在线观看| 国产成人综合久久久久久| 在线播放亚洲一区蜜臀| 亚洲色成人www在线观看| 456亚洲人成高清在线| 免费无码AV片在线观看国产| 伊人亚洲综合网色AV另类| 最新国产精品拍自在线观看| 日韩av不卡一二三区| 精品国产乱码久久久软件下载| 人妻少妇被粗大爽在线| 宿松县| 一级毛片免费观看久| 99精品欧美一区二区三区美图| 一本一道精品欧美中文字幕| 国产成人啪视频一区二区三区| 久久久亚洲精品一区二区三区| 国自产拍欧美久久一本到88色鬼首页| 久久久久88色偷偷| 久久精品女人天堂av影院| 亚洲成人av在线系列| 欧美日韩亚洲中文字幕二区| 亚洲人成网7777777国产|