lexy

          支持開源,尊重他人的勞動!

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            17 隨筆 :: 0 文章 :: 9 評論 :: 0 Trackbacks

          一、前言  
            用Java解析XML文檔,最常用的有兩種方法:使用基于事件的XML簡單API(Simple API for XML)稱為SAX和基于樹和節(jié)點的文檔對象模型(Document Object Module)稱為DOM。Sun公司提供了Java API for XML Parsing(JAXP)接口來使用SAX和DOM,通過JAXP,我們可以使用任何與JAXP兼容的XML解析器。 
            JAXP接口包含了三個包:  
            (1)org.w3c.dom W3C推薦的用于XML標(biāo)準(zhǔn)規(guī)劃文檔對象模型的接口。  
            (2)org.xml.sax  用于對XML進(jìn)行語法分析的事件驅(qū)動的XML簡單API(SAX)  
           ?。?)javax.xml.parsers解析器工廠工具,程序員獲得并配置特殊的特殊語法分析器?! ?br />   二、前提  
            DOM編程不要其它的依賴包,因為JDK里自帶的JDK里含有的上面提到的org.w3c.dom、org.xml.sax 和javax.xml.parsers包就可以滿意條件了?! ?br />   三、使用DOM解析XML文檔  
            我們現(xiàn)在來看看DOM是如何解析XML的吧!同樣的,我將從一個簡單的不能再簡單的例子來說明DOM是如何解析XML文檔的,先讓我們看看XML是什么內(nèi)容吧:
          <?xml version="1.0" encoding="gb2312"?>  
          <books>  
          <book email="zhoujunhui">  
          <name>rjzjh</name>  
          <price>jjjjjj</price>  
          </book>  
          </books>
          public void useDomParseXml() {
                  DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();        
                  try {
                      DocumentBuilder dombuilder=domfac.newDocumentBuilder();
                      InputStream is = new FileInputStream("bin/library.xml");
                      Document doc = dombuilder.parse(is);            
                      Element root=doc.getDocumentElement();
                      NodeList books=root.getChildNodes();            
                      if (books != null) {
                          for (int i = 0; i < books.getLength(); i++) {
                              Node book = books.item(i);
                              if (book.getNodeType() == Node.ELEMENT_NODE) {
                                  String email = book.getAttributes().getNamedItem(
                                          "email").getNodeValue();                        
                                  System.out.println(email);                        
                                  for (Node node = book.getFirstChild(); node != null;
                                                   node = node.getNextSibling()) {
                                      if(node.getNodeType()==Node.ELEMENT_NODE){
                                          if (node.getNodeName().equals("name")) {
                                              String name = node.getFirstChild().
                                                      getNodeValue();
                                              System.out.println(name);
                                          }                                
                                          if (node.getNodeName().equals("price")) {
                                              String price = node.getFirstChild().
                                                      getNodeValue();
                                              System.out.println(price);
                                          }
                                      }
                                  }
                              }
                          }
                      }
                  } catch (Exception e) {            
                  }
              }

          (1)得到DOM解析器的工廠實例  
            DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();  
            得到j(luò)avax.xml.parsers.DocumentBuilderFactory;類的實例就是我們要的解析器工廠  
            (2)從DOM工廠獲得DOM解析器  
            DocumentBuilder dombuilder=domfac.newDocumentBuilder();  
            通過javax.xml.parsers.DocumentBuilderFactory實例的靜態(tài)方法newDocumentBuilder()得到DOM解析器  
           ?。?)把要解析的XML文檔轉(zhuǎn)化為輸入流,以便DOM解析器解析它  
            InputStream is=new FileInputStream("bin/library.xml");  
            InputStream是一個接口?! ?br />   (4)解析XML文檔的輸入流,得到一個Document  
            Document doc=dombuilder.parse(is); 
            由XML文檔的輸入流得到一個org.w3c.dom.Document對象,以后的處理都是對Document對象進(jìn)行的 
           ?。?)得到XML文檔的根節(jié)點  
            Element root=doc.getDocumentElement();  
            在DOM中只有根節(jié)點是一個org.w3c.dom.Element對象。
           ?。?)得到節(jié)點的子節(jié)點  
            NodeList books=root.getChildNodes();  
            for(int i=0;i<books.getLength();i++){  
            Node book=books.item(i);  
            }
            這是用一個org.w3c.dom.NodeList接口來存放它所有子節(jié)點的,還有一種輪循子節(jié)點的方法,后面有介紹  
            (7)取得節(jié)點的屬性值  
            String email=book.getAttributes().getNamedItem("email").getNodeValue();  
            System.out.println(email);  
            注意,節(jié)點的屬性也是它的子節(jié)點。它的節(jié)點類型也是Node.ELEMENT_NODE  
           ?。?)輪循子節(jié)點  
            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();  
            System.out.println(name);  
            System.out.println(name1);  
            }  
            if(node.getNodeName().equals("price")){  
            String price=node.getFirstChild().getNodeValue();  
            System.out.println(price);
            }  
            }  
            這段代碼的打印輸出為:
            null  
            alterrjzjh  
            jjjjjj
            從上面可以看出  
            String name=node.getNodeValue();  是一個空值。而  
            String name1=node.getFirstChild().getNodeValue(); 才是真正的值,這是因為DOM把<name>rjzjh</name>也當(dāng)作是兩層結(jié)構(gòu)的節(jié)點.
          原文 :http://www.cnblogs.com/Steveson/archive/2007/06/04/770653.html

          posted on 2007-10-26 15:18 lexy 閱讀(2808) 評論(1)  編輯  收藏

          評論

          # re: Java解析XML文檔——dom解析xml (轉(zhuǎn)載) 2008-01-29 10:23 文喜
          新哥,這個不錯!又學(xué)到不少東西!  回復(fù)  更多評論
            


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 道真| 天镇县| 颍上县| 吉首市| 巴楚县| 阜宁县| 那坡县| 鹤峰县| 芜湖县| 五常市| 札达县| 安陆市| 宝兴县| 华容县| 石景山区| 甘泉县| 怀宁县| 金塔县| 德化县| 岑巩县| 海盐县| 昌乐县| 成安县| 邵阳县| 丹凤县| 靖远县| 开化县| 招远市| 罗甸县| 华阴市| 方山县| 五大连池市| 四川省| 巫溪县| 南雄市| 宝丰县| 东平县| 淳安县| 克东县| 织金县| 林州市|