java解析xml文件及一個問題

          Java解析xml有幾種方法,而我這里只選擇2中方法,DOM和SAX進行解析。
          xml文件。
          <?xml version="1.0" encoding="UTF-8"?>
          <persons>
              
          <person>
                  
          <name>劉晨</name>
                  
          <sex></sex>
                  
          <age>23</age>
                  
          <class>數(shù)學(xué)一班</class>
              
          </person>
              
          <person>
                  
          <name>張鳳</name>
                  
          <sex></sex>
                  
          <age>21</age>
                  
          <class>英語四班</class>
              
          </person>
          </persons>
          首先是DOM。代碼
           1 package com.duduli.xml;
           2 
           3 import java.io.IOException;
           4 
           5 import javax.xml.parsers.DocumentBuilder;
           6 import javax.xml.parsers.DocumentBuilderFactory;
           7 import javax.xml.parsers.ParserConfigurationException;
           8 
           9 import org.w3c.dom.Document;
          10 import org.w3c.dom.Node;
          11 import org.w3c.dom.NodeList;
          12 import org.xml.sax.SAXException;
          13 
          14 
          15 public class DomParse {
          16 
          17     public void parseXML(){
          18         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
          19         try {
          20             DocumentBuilder db = factory.newDocumentBuilder();
          21             Document doc = db.parse("src\\com\\duduli\\xml\\person.xml");
          22             NodeList root = doc.getElementsByTagName("person");
          23             int rootSize = root.getLength();
          24                 for (int i = 0; i < rootSize; i++) {
          25                     System.out.println("解析第" + (i+1+"個同學(xué)");
          26                     Node n = root.item(i);
          27                     NodeList child = n.getChildNodes();
          28                     int childSize = child.getLength();
          29                         for (int j = 0; j < childSize; j++) {
          30                             Node n2 = child.item(j);
          31                             if (n2.hasChildNodes()) {
          32                                 System.out.println(n2.getNodeName() + " = " + n2.getFirstChild().getNodeValue());
          33                            }
          34                         }
          35                         System.out.println();
          36                     }
          37         }catch (ParserConfigurationException e) {
          38             e.printStackTrace();
          39         } catch (SAXException e) {
          40             e.printStackTrace();
          41         } catch (IOException e) {
          42             e.printStackTrace();
          43         }
          44     }
          45 
          46     public static void main(String[] args) {
          47         DomParse dp = new DomParse();
          48         dp.parseXML();
          49     }
          50 
          51 }
          52 

          輸出:
          解析第1個同學(xué)
          name 
          = 劉晨
          sex 
          = 男
          age 
          = 23
          class = 數(shù)學(xué)一班

          解析第2個同學(xué)
          name 
          = 張鳳
          sex 
          = 女
          age 
          = 21
          class = 英語四班
          還有一個就是用SAX
           1 package com.duduli.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.Attributes;
          11 import org.xml.sax.SAXException;
          12 import org.xml.sax.helpers.DefaultHandler;
          13 
          14  
          15 public class SaxParse extends DefaultHandler  
          16 {       
          17     public static void main(String[] args)   
          18     {   
          19         SAXParserFactory factory = SAXParserFactory.newInstance();
          20         try {
          21             SAXParser parser = factory.newSAXParser();
          22             try {
          23                 parser.parse(new File("src\\com\\duduli\\xml\\person.xml"), new SaxParse());
          24             } catch (IOException e) {
          25                 e.printStackTrace();
          26             }
          27         } catch (ParserConfigurationException e) {
          28             e.printStackTrace();
          29         } catch (SAXException e) {
          30             e.printStackTrace();
          31         }
          32     }
          33     
          34     public void startDocument(){
          35         System.out.println("***開始***");
          36     }
          37         
          38     public void startElement(String uri,String localName,String qName,Attributes attribute)
          39     throws SAXException{
          40         System.out.println("開始節(jié)點 :" + qName);
          41     }
          42     
          43     
          44     public void characters(char[] ch, int start, int length)
          45             throws SAXException {
          46 //        System.out.println("--------"+new String(ch,start,length)+"--------");
          47         if(new String(ch,start,length) != "\n\r"){
          48          System.out.println("節(jié)點值: " + new String(ch,start,length));
          49         }
          50     }
          51 
          52     public void endElement(String uri, String localName, String name)
          53             throws SAXException {
          54         System.out.println("結(jié)束節(jié)點: " + name);
          55     }
          56 
          57     public void endDocument (){
          58          System.out.println("****文檔結(jié)束***");
          59      }
          60 }
          61
          在這里需要指出的是dom方法在對于嵌套的xml解析是不能成功的。
          用SAM解析就是extends DefaultHandler這個方法,然后復(fù)寫他已有的方法。
          輸出:***開始***
          開始節(jié)點 :persons
          節(jié)點值: 
              
          開始節(jié)點 :person
          節(jié)點值: 
                  
          開始節(jié)點 :name
          節(jié)點值: 劉晨
          結(jié)束節(jié)點: name
          節(jié)點值: 
                  
          開始節(jié)點 :sex
          節(jié)點值: 男
          結(jié)束節(jié)點: sex
          節(jié)點值: 
                  
          開始節(jié)點 :age
          節(jié)點值: 
          23
          結(jié)束節(jié)點: age
          節(jié)點值: 
                  
          開始節(jié)點 :
          class
          節(jié)點值: 數(shù)學(xué)一班
          結(jié)束節(jié)點: 
          class
          節(jié)點值: 
              
          結(jié)束節(jié)點: person
          節(jié)點值: 
              
          開始節(jié)點 :person
          節(jié)點值: 
                  
          開始節(jié)點 :name
          節(jié)點值: 張鳳
          結(jié)束節(jié)點: name
          節(jié)點值: 
                  
          開始節(jié)點 :sex
          節(jié)點值: 女
          結(jié)束節(jié)點: sex
          節(jié)點值: 
                  
          開始節(jié)點 :age
          節(jié)點值: 
          21
          結(jié)束節(jié)點: age
          節(jié)點值: 
                  
          開始節(jié)點 :
          class
          節(jié)點值: 英語四班
          結(jié)束節(jié)點: 
          class
          節(jié)點值: 
              
          結(jié)束節(jié)點: person
          節(jié)點值: 

          結(jié)束節(jié)點: persons
          ****文檔結(jié)束***

          如果看SAX結(jié)果就知道,不管是開始節(jié)點還是結(jié)束節(jié)點都會有個“節(jié)點值”的輸出。
          這個弄了我又很久,不知道哪位有什么解決的辦法沒?


          按照所獲將xml修改為
          <?xml version="1.0" encoding="UTF-8"?>
          <persons>
          <person>
          <name>劉晨</name>
          <sex></sex>
          <age>23</age>
          <class>數(shù)學(xué)一班</class>
          </person>
          <person>
          <name>張鳳</name>
          <sex></sex>
          <age>21</age>
          <class>英語四班</class>
          </person>
          </persons>

          然后測試各個值,(start,length,及其關(guān)系),發(fā)現(xiàn)為空值的length都為1,所以修改characters方法
              public void characters(char[] ch, int start, int length)
                      
          throws SAXException {
          //        System.out.println("--------"+new String(ch,start,length)+"--------");
                  if(length != 1){
          //            System.out.println(length);
                   System.out.println("節(jié)點值: " + new String(ch,start,length));
                  }
              }
           
          此時問題又出現(xiàn)了,在sex的中l(wèi)ength也為1.
          沒辦法修改sex,男修改為man,而女修改為woman。
          得到正確結(jié)果
          ***開始***
          開始節(jié)點 :persons
          開始節(jié)點 :person
          開始節(jié)點 :name
          節(jié)點值: 劉晨
          結(jié)束節(jié)點: name
          開始節(jié)點 :sex
          節(jié)點值: man
          結(jié)束節(jié)點: sex
          開始節(jié)點 :age
          節(jié)點值: 
          23
          結(jié)束節(jié)點: age
          開始節(jié)點 :
          class
          節(jié)點值: 數(shù)學(xué)一班
          結(jié)束節(jié)點: 
          class
          結(jié)束節(jié)點: person
          開始節(jié)點 :person
          開始節(jié)點 :name
          節(jié)點值: 張鳳
          結(jié)束節(jié)點: name
          開始節(jié)點 :sex
          節(jié)點值: woman
          結(jié)束節(jié)點: sex
          開始節(jié)點 :age
          節(jié)點值: 
          21
          結(jié)束節(jié)點: age
          開始節(jié)點 :
          class
          節(jié)點值: 英語四班
          結(jié)束節(jié)點: 
          class
          結(jié)束節(jié)點: person
          結(jié)束節(jié)點: persons
          ****文檔結(jié)束***

          一下是JDOM解析xml文件
          xml文件
          <?xml version="1.0" encoding="UTF-8"?>
          <persons>
              
          <person email="ok@sina.com">
                  
          <name>劉晨</name>
                  
          <sex>man</sex>
                  
          <age>23</age>
                  
          <class>數(shù)學(xué)一班</class>
              
          </person>
              
          <person email="good@tom.com">
                  
          <name>張鳳</name>
                  
          <sex>woman</sex>
                  
          <age>21</age>
                  
          <class>英語四班</class>
              
          </person>
          </persons>

          代碼:
          package com.duduli.xml;

          import java.io.IOException;
          import java.io.FileOutputStream;
          import java.util.Iterator;
          import java.util.List;

          import org.jdom.Document;
          import org.jdom.Element;
          import org.jdom.JDOMException;
          import org.jdom.input.SAXBuilder;
          import org.jdom.output.XMLOutputter;

          public class JDomParse {
              @SuppressWarnings(
          "unchecked")
              JDomParse(String path){
              SAXBuilder builder 
          = new SAXBuilder(false);
              
          try {
                  Document doc 
          = builder.build(path);
                  Element persons 
          = doc.getRootElement();
                  List list 
          = persons.getChildren("person");
                  
          for(Iterator it = list.iterator();it.hasNext();){
                      Element person 
          = (Element) it.next();
          //            getArrtibuteValue得到的是屬性值
                      String email = person.getAttributeValue("email");
                      System.out.println(email);
                      String name 
          = person.getChildTextTrim("name");
                      System.out.println(name);
                      String sex 
          = person.getChildTextTrim("sex");
                      System.out.println(sex);
                      String age 
          = person.getChildTextTrim("age");
                      System.out.println(age);
                      String className 
          = person.getChildTextTrim("class");
                      System.out.println(className);
                      System.out.println();
                  }
                  XMLOutputter out 
          = new XMLOutputter();
                  out.output(doc, 
          new FileOutputStream(path));
              } 
          catch (JDOMException e) {
                  e.printStackTrace();
              } 
          catch (IOException e) {
                  e.printStackTrace();
              }
              }

              
          public static void main(String[] args) {
                  new JDomParse("src\\com\\duduli\\xml\\person.xml");

              }

          }
          首先你必須先倒入jdom的開發(fā)包。
          覺得jdom的方法很簡單,類似于jdbc取得數(shù)據(jù)庫中的數(shù)據(jù)一樣。

          posted on 2009-02-25 22:49 duduli 閱讀(2805) 評論(2)  編輯  收藏 所屬分類: java

          評論

          # re: java解析xml文件及一個問題 2009-02-26 09:49 逝水fox

          你把節(jié)點和節(jié)點之間的空白部分全部清除掉就沒有這個空的節(jié)點值了

          原因是在于 SAX對 節(jié)點和節(jié)點之間空白部分的判定 他把他判定成包含這些空白字符的文本節(jié)點 而不是忽略掉 所以就有這個問題  回復(fù)  更多評論   

          # re: java解析xml文件及一個問題 2014-10-23 19:11 tert

          xgdgs  回復(fù)  更多評論   

          <2014年10月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導(dǎo)航

          統(tǒng)計

          公告

          welcome to my place.

          常用鏈接

          留言簿(5)

          我參與的團隊

          隨筆分類

          隨筆檔案

          新聞分類

          石頭JAVA擺地攤兒

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          @duduli
          主站蜘蛛池模板: 海林市| 钟山县| 修水县| 炉霍县| 济源市| 古交市| 舞阳县| 青海省| 江门市| 古浪县| 西乡县| 麻栗坡县| 夏邑县| 威海市| 文安县| 万全县| 宾川县| 仙居县| 太仓市| 弥渡县| 克什克腾旗| 余江县| 仁化县| 怀宁县| 贺州市| 麟游县| 金坛市| 固始县| 德格县| 红河县| 乌鲁木齐县| 吉水县| 锦屏县| 正蓝旗| 龙游县| 泰州市| 喀喇沁旗| 乌拉特中旗| 霍邱县| 石景山区| 神池县|