一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

java解析xml常用的三種方法

 ls02 2014-08-06
(I)Java通過(guò)DOM解析XML
 
1>得到DOM解析器的工廠實(shí)例
  DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
  得到j(luò)avax.xml.parsers.DocumentBuilderFactory;類的實(shí)例就是我們要的解析器工廠
  
2>從DOM工廠獲得DOM解析器
  DocumentBuilder dombuilder=domfac.newDocumentBuilder();
  通過(guò)javax.xml.parsers.DocumentBuilderFactory實(shí)例的靜態(tài)方法newDocumentBuilder()得到DOM解析器
  
3>把要解析的XML文檔轉(zhuǎn)化為輸入流,以便DOM解析器解析它
  InputStream is=new FileInputStream("bin/library.xml");
  InputStream是一個(gè)接口。
4>解析XML文檔的輸入流,得到一個(gè)Document
  Document doc=dombuilder.parse(is);
  由XML文檔的輸入流得到一個(gè)org.w3c.dom.Document對(duì)象,以后的處理都是對(duì)Document對(duì)象進(jìn)行的
  
5>得到XML文檔的根節(jié)點(diǎn)
  Element root=doc.getDocumentElement();
  在DOM中只有根節(jié)點(diǎn)是一個(gè)org.w3c.dom.Element對(duì)象。
  
6>得到節(jié)點(diǎn)的子節(jié)點(diǎn)
  NodeList books=root.getChildNodes();
  for(int i=0;i<books.getLength();i++){
 Node book=books.item(i);
  }
   這是用一個(gè)org.w3c.dom.NodeList接口來(lái)存放它所有子節(jié)點(diǎn)的,還有一種輪循子節(jié)點(diǎn)的方法,后面有介紹
  
7>取得節(jié)點(diǎn)的屬性值
  String email=book.getAttributes().getNamedItem("email").getNodeValue();
  System.out.println(email);
  注意,節(jié)點(diǎn)的屬性也是它的子節(jié)點(diǎn)。它的節(jié)點(diǎn)類型也是Node.ELEMENT_NODE
  
8>輪循子節(jié)點(diǎn)
  for(Node node=book.getFirstChild();node!=null;node=node.getNextSibling()){
  
    if(node.getNodeType()==Node.ELEMENT_NODE){
  
        if(node.getNodeName().equals("name")){
  
     String name=node.getNodeValue();
   
     String name1=node.getFirstChild().getNodeValue();
   
    ...
   
     if(node.getNodeName().equals("price")){
   
     String price=node.getFirstChild().getNodeValue();
...
  
 
Java代碼  收藏代碼
  1. <span style="font-family: courier new,courier; font-size: small;"><?xml version="1.0" encoding="UTF-8"?>   
  2. <xml>   
  3.     <conn-params>   
  4.         <conn-url>jdbc:mysql://192.168.101.7:3306/bbs</conn-url>   
  5.         <conn-driver>com.mysql.jdbc.Driver</conn-driver>   
  6.         <conn-username>root</conn-username>   
  7.         <conn-password>root</conn-password>   
  8.     </conn-params>   
  9.         
  10.     <person>   
  11.         <user>   
  12.             <username>xzc</username>   
  13.             <password>sdf23223</password>   
  14.             <birthday>2012-01-23</birthday>   
  15.         </user>   
  16.         <user>   
  17.             <username>誤闖</username>   
  18.             <password>wuchuang3223</password>   
  19.             <birthday>2002-01-03</birthday>   
  20.         </user>   
  21.     </person>   
  22. </xml> </span>  
  
////////////////////////////////////////////////////////////////////////////////////
  
Java代碼  收藏代碼
  1. <span style="font-family: courier new,courier; font-size: small;">package com.xcz.xml;   
  2.     
  3. import java.io.File;   
  4. import java.io.IOException;   
  5. import java.util.List;   
  6.     
  7. import javax.xml.parsers.ParserConfigurationException;   
  8.     
  9. import org.xml.sax.SAXException;   
  10.     
  11. import com.xcz.po.User;   
  12. import com.xcz.xml.util.DomUtil;   
  13.     
  14. public class Dom4Xml {   
  15.     
  16.     private DomUtil domUtil = new DomUtil();   
  17.         
  18.     public static void main(String[] args) {   
  19.         try {   
  20.             File f = new File("src/jdbc-params.xml");   
  21.             List<User> list = new Dom4Xml().domUtil.parseXml(f);   
  22.             for (User user : list) {   
  23.                 System.out.println(user);   
  24.             }   
  25.         } catch (ParserConfigurationException e) {   
  26.             e.printStackTrace();   
  27.         } catch (SAXException e) {   
  28.             e.printStackTrace();   
  29.         } catch (IOException e) {   
  30.             e.printStackTrace();   
  31.         }   
  32.             
  33.     }   
  34. } </span>  
 
  
////////////////////////////////////////////////////////////////////////////////////
  
Java代碼  收藏代碼
  1. <span style="font-family: courier new,courier; font-size: small;">package com.xcz.xml.util;   
  2.     
  3. import java.io.File;   
  4. import java.io.IOException;   
  5. import java.util.ArrayList;   
  6. import java.util.List;   
  7.     
  8. import javax.xml.parsers.DocumentBuilder;   
  9. import javax.xml.parsers.DocumentBuilderFactory;   
  10. import javax.xml.parsers.ParserConfigurationException;   
  11.     
  12. import org.w3c.dom.Document;   
  13. import org.w3c.dom.Element;   
  14. import org.w3c.dom.Node;   
  15. import org.w3c.dom.NodeList;   
  16. import org.xml.sax.SAXException;   
  17.     
  18. import com.xcz.po.User;   
  19.     
  20. public class DomUtil {   
  21.     
  22.     private DocumentBuilderFactory factory;   
  23.     private DocumentBuilder builder;   
  24.     private Document document;   
  25.         
  26.     private List<User> list;   
  27.         
  28.     /**  
  29.      * 創(chuàng)建一個(gè)DocumentBuilderFactory 對(duì)象  
  30.      * @return DocumentBuilderFactory  
  31.      */   
  32.     private DocumentBuilderFactory getDocumentBuilderFactory(){   
  33.         return DocumentBuilderFactory.newInstance();   
  34.     }   
  35.         
  36.     /**  
  37.      * 創(chuàng)建一個(gè)DocumentBulider 對(duì)象  
  38.      * @param DocumentBuilderFactory fac   
  39.      * @return DocumentBuilder  
  40.      * @throws ParserConfigurationException  
  41.      */   
  42.     private DocumentBuilder getDocumentBuilder(DocumentBuilderFactory fac) throws ParserConfigurationException{   
  43.         return fac.newDocumentBuilder();   
  44.     }   
  45.         
  46.     /**  
  47.      * 功能:解析XML文件  
  48.      * @param file xml文件  
  49.      * @return List<User>  
  50.      * @throws ParserConfigurationException  
  51.      * @throws SAXException  
  52.      * @throws IOException  
  53.      */   
  54.     public List<User> parseXml(File file) throws ParserConfigurationException, SAXException, IOException{   
  55.         factory = getDocumentBuilderFactory();   
  56.         builder = getDocumentBuilder(factory);   
  57.         document = builder.parse(file);   
  58.         List<User> list = parseXmlProcess(document);   
  59.         return list;   
  60.     }   
  61.         
  62.     /**  
  63.      * 功能:xml文件具體解析過(guò)程  
  64.      * @param document  
  65.      * @return List<User>  
  66.      */   
  67.     private List<User> parseXmlProcess(Document document){   
  68.         list = new ArrayList<User>();   
  69.             
  70.         //獲取根節(jié)點(diǎn)   
  71.         Element root = document.getDocumentElement();   
  72.         //獲取根節(jié)點(diǎn)下面的所有孩子節(jié)點(diǎn)   
  73.         NodeList childNodes = root.getChildNodes();   
  74.             
  75.         for(int i=0; i<childNodes.getLength(); i++){//獲取節(jié)點(diǎn)集合長(zhǎng)度:getLength()   
  76.             Node node = childNodes.item(i);//獲取第index 節(jié)點(diǎn):item(index)   
  77.                 
  78.             if("person".equals(node.getNodeName())){//獲取當(dāng)前節(jié)點(diǎn)tagName:getNodeName()   
  79.                 NodeList pChildNodes = node.getChildNodes();   
  80.                 
  81.                 for(int p=0; p<pChildNodes.getLength(); p++){   
  82.                     Node pNode = pChildNodes.item(p);   
  83.                     
  84.                     if("user".equals(pNode.getNodeName())){   
  85.                         User user = new User();   
  86.                         NodeList uChildNodes = pNode.getChildNodes();   
  87.                         
  88.                         for(int u=0;u<uChildNodes.getLength();u++){   
  89.                                 
  90.                             Node uNode = uChildNodes.item(u);   
  91.                             
  92.                             if("username".equals(uNode.getNodeName())){   
  93.                                 user.setUsername(uNode.getTextContent());//獲取當(dāng)前節(jié)點(diǎn)的具體內(nèi)容:getTextContent()   
  94.                             }   
  95.                             if("password".equals(uNode.getNodeName())){   
  96.                                 user.setPassword(uNode.getTextContent());   
  97.                             }   
  98.                             if("birthday".equals(uNode.getNodeName())){   
  99.                                 user.setBirthday(uNode.getTextContent());   
  100.                             }   
  101.                         }   
  102.                         list.add(user);   
  103.                     }   
  104.                 }   
  105.             }   
  106.         }   
  107.             
  108.         return list;   
  109.     }   
  110. }</span>  
 
 
 
 
(II)Java通過(guò)SAX解析XML
    Simple API for XML(簡(jiǎn)稱SAX)是個(gè)循序存取XML的解析器API。

    一個(gè)實(shí)現(xiàn)SAX的解析器(也就是“SAX Parser”)以一個(gè)串流解析器的型式作用,擁有事件驅(qū)動(dòng)API。由使用者定義回調(diào)函數(shù),解析時(shí),若發(fā)生事件的話會(huì)被調(diào)用。SAX事件包括:

  • XML 文字 節(jié)點(diǎn)
  • XML 元素 節(jié)點(diǎn)
  • XML 處理指令
  • XML 注釋

 

Java代碼  收藏代碼
  1. <person>   
  2.     <user>   
  3.         <username>謝成志</username>   
  4.         <password>6626310xie</password>   
  5.         <sex>男</sex>   
  6.         <birthday>1988/11/28</birthday>   
  7.         <headpic>   
  8.             <pictitle>ermao</pictitle>   
  9.             <picurl>images/head1.jpg</picurl>   
  10.         </headpic>   
  11.     </user>   
  12. </person>   
 此為下面即將解析度簡(jiǎn)單xml結(jié)構(gòu),并將其封裝成一個(gè)User對(duì)象。
 
////////////////////////////////////////////////////////////////////////////////////
Java代碼  收藏代碼
  1. <span style="font-family: courier new,courier; font-size: small;">package com.xcz.xml;   
  2.     
  3. import java.io.File;   
  4. import java.io.IOException;   
  5.     
  6. import javax.xml.parsers.ParserConfigurationException;   
  7. import javax.xml.parsers.SAXParser;   
  8. import javax.xml.parsers.SAXParserFactory;   
  9.     
  10. import org.xml.sax.SAXException;   
  11.     
  12. import com.xcz.util.SaxUtil;   
  13.     
  14. public class Sax4XML {   
  15.     
  16.     public static void main(String[] args) {   
  17.             
  18.         try {   
  19.             //1.獲取factory   
  20.             SAXParserFactory factory = SAXParserFactory.newInstance();   
  21.             //2.獲取parser   
  22.             SAXParser parser = factory.newSAXParser();   
  23.             //3.獲取解析時(shí)的監(jiān)聽器對(duì)象   
  24.             SaxUtil su = new SaxUtil();   
  25.             //4.開始解析   
  26.             parser.parse(new File("src/user-params.xml"), su);   
  27.                 
  28.             System.out.println(su.getUser());   
  29.             
  30.         } catch (ParserConfigurationException e) {   
  31.             e.printStackTrace();   
  32.         } catch (SAXException e) {   
  33.             e.printStackTrace();   
  34.         } catch (IOException e) {   
  35.             e.printStackTrace();   
  36.         }   
  37.             
  38.     }   
  39. }   
  40. </span>  
 
////////////////////////////////////////////////////////////////////////////////////
Java代碼  收藏代碼
  1. <span style="font-family: courier new,courier; font-size: small;">package com.xcz.util;   
  2.     
  3. import java.text.ParseException;   
  4. import java.text.SimpleDateFormat;   
  5.     
  6. import org.xml.sax.Attributes;   
  7. import org.xml.sax.SAXException;   
  8. import org.xml.sax.helpers.DefaultHandler;   
  9.     
  10. import com.xcz.po.HeadPic;   
  11. import com.xcz.po.User;   
  12.     
  13. /**  
  14.  * 定義xml解析時(shí)的監(jiān)聽類  
  15.  *   
  16.  * 實(shí)現(xiàn)方式有很多,可以實(shí)現(xiàn)接口:ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler   
  17.  * 但我們常用的繼承:DefaultHandler   
  18.  */   
  19. public class SaxUtil extends DefaultHandler {   
  20.     
  21.     private User user;   
  22.     private HeadPic headPic;   
  23.     private String content;   
  24.     private SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");   
  25.         
  26.     @Override   
  27.     public void characters(char[] ch, int start, int length)   
  28.             throws SAXException {   
  29.         content = new String(ch, start, length);   
  30.     }   
  31.         
  32.     //當(dāng)解析到文本開始時(shí)觸發(fā)   
  33.     @Override   
  34.     public void startDocument() throws SAXException {   
  35.         super.startDocument();   
  36.     }   
  37.         
  38.     //當(dāng)解析到文本結(jié)束時(shí)觸發(fā)   
  39.     @Override   
  40.     public void endDocument() throws SAXException {   
  41.         super.endDocument();   
  42.     }   
  43.         
  44.     //當(dāng)解析到元素開始時(shí)觸發(fā)   
  45.     @Override   
  46.     public void startElement(String uri, String localName, String name,   
  47.             Attributes attributes) throws SAXException    
  48.     {   
  49.         if("user".equals(name))   
  50.         {   
  51.             user = new User();   
  52.         }   
  53.         if("headpic".equals(name))   
  54.         {   
  55.             headPic = new HeadPic();   
  56.         }   
  57.     }   
  58.         
  59.     //當(dāng)解析到元素結(jié)束時(shí)觸發(fā)   
  60.     @Override   
  61.     public void endElement(String uri, String localName, String name)   
  62.             throws SAXException    
  63.     {   
  64.         if("username".equals(name))   
  65.         {   
  66.             user.setUsername(content);   
  67.         }   
  68.         if("password".equals(name))   
  69.         {   
  70.             user.setPassword(content);   
  71.         }   
  72.         if("sex".equals(name))   
  73.         {   
  74.             user.setSex(content);   
  75.         }   
  76.         if("birthday".equals(name))   
  77.         {   
  78.             try {   
  79.                 user.setBirthday(sdf.parse(content));   
  80.             } catch (ParseException e) {   
  81.                 // TODO Auto-generated catch block   
  82.                 e.printStackTrace();   
  83.             }   
  84.         }   
  85.         if("pictitle".equals(name))   
  86.         {   
  87.             headPic.setPicTitle(content);   
  88.         }   
  89.         if("picurl".equals(name))   
  90.         {   
  91.             headPic.setPicUrl(content);   
  92.             user.setHeadPic(headPic);   
  93.         }   
  94.             
  95.     }   
  96.     
  97.     public User getUser(){   
  98.         return user;   
  99.     }   
  100.         
  101. }</span>  
 

[優(yōu)點(diǎn)]

    (1).節(jié)約內(nèi)存開銷   

    SAX解析器在某些方面優(yōu)于DOM風(fēng)格解析器,因?yàn)镾AX解析器的內(nèi)存使用量一般遠(yuǎn)低于DOM解析器使用量。DOM解析器在任何處理開始之前,必須將xml以整棵樹放在內(nèi)存,所以DOM解析器的內(nèi)存使用量完全根據(jù)輸入資料的大小。相對(duì)來(lái)說(shuō),SAX解析器的內(nèi)存內(nèi)容,是只基于XML檔案的最大深度(XML樹的最大深度)和單一XML項(xiàng)目上XML屬性儲(chǔ)存的最大資料。

    (2)解析速度快

    因?yàn)镾AX事件驅(qū)動(dòng)的本質(zhì),處理文件通常會(huì)比DOM風(fēng)格的解析器快。 

[缺點(diǎn)]

    SAX事件驅(qū)動(dòng)的模型對(duì)于XML解析很有用,但它確實(shí)有某些缺點(diǎn)。

    某些種類的XML驗(yàn)證需要存取整份文件。例如,一個(gè)DTD IDREF屬性需要文件內(nèi)有項(xiàng)目使用指定字串當(dāng)成DTD ID屬性。要在SAX解析器內(nèi)驗(yàn)證,必須追蹤每個(gè)之前遇過(guò)的ID和IDREF屬性,檢查是否有任何相符。更甚者,一個(gè)IDREF找不到對(duì)應(yīng)的ID,使用者只會(huì)在整份文件都解析完后才發(fā)現(xiàn),若這種連結(jié)對(duì)于建立有效輸出是重要的,那用在處理整份文件的時(shí)間只是浪費(fèi)。

    另外,某些XML處理僅要求存取整份文件。舉例來(lái)說(shuō),XSLTXPath需要能夠任何時(shí)間存取任何解析過(guò)的XML樹。當(dāng)SAX以用來(lái)建構(gòu)此樹時(shí),DOM解析器在設(shè)計(jì)上已經(jīng)是如此了。



    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    亚洲国产成人久久99精品| 又大又长又粗又黄国产| 成年午夜在线免费视频| 国产精品亚洲一区二区| 九九热这里只有精品哦| 国产一区二区三区色噜噜| 人妻偷人精品一区二区三区不卡 | 国产日韩熟女中文字幕| 男人和女人草逼免费视频| 夫妻性生活动态图视频| 国产毛片不卡视频在线| 99久久人妻精品免费一区| 成人精品日韩专区在线观看| 久久本道综合色狠狠五月| 亚洲国产成人精品福利| 嫩呦国产一区二区三区av| 国产一区国产二区在线视频| 婷婷亚洲综合五月天麻豆| 国产成人午夜福利片片| 中文字幕亚洲精品在线播放| 黄色激情视频中文字幕| 人妻一区二区三区在线| 青青操精品视频在线观看| 日本精品中文字幕在线视频 | 不卡一区二区在线视频| 又黄又色又爽又免费的视频| 国产精品免费精品一区二区| 手机在线不卡国产视频| 精品少妇一区二区三区四区| 国产日韩欧美专区一区| 免费大片黄在线观看国语| 91福利视频日本免费看看| 国产又色又爽又黄又大| 亚洲中文字幕视频一区二区| 九九热视频经典在线观看| 亚洲国产精品国自产拍社区| 狠狠干狠狠操在线播放| 中文精品人妻一区二区| 日韩在线精品视频观看| 91人人妻人人爽人人狠狠| 亚洲国产精品肉丝袜久久|