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>數學一班</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+"個同學");
          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個同學
          name 
          = 劉晨
          sex 
          = 男
          age 
          = 23
          class = 數學一班

          解析第2個同學
          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("開始節點 :" + 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("節點值: " + 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("結束節點: " + name);
          55     }
          56 
          57     public void endDocument (){
          58          System.out.println("****文檔結束***");
          59      }
          60 }
          61
          在這里需要指出的是dom方法在對于嵌套的xml解析是不能成功的。
          用SAM解析就是extends DefaultHandler這個方法,然后復寫他已有的方法。
          輸出:***開始***
          開始節點 :persons
          節點值: 
              
          開始節點 :person
          節點值: 
                  
          開始節點 :name
          節點值: 劉晨
          結束節點: name
          節點值: 
                  
          開始節點 :sex
          節點值: 男
          結束節點: sex
          節點值: 
                  
          開始節點 :age
          節點值: 
          23
          結束節點: age
          節點值: 
                  
          開始節點 :
          class
          節點值: 數學一班
          結束節點: 
          class
          節點值: 
              
          結束節點: person
          節點值: 
              
          開始節點 :person
          節點值: 
                  
          開始節點 :name
          節點值: 張鳳
          結束節點: name
          節點值: 
                  
          開始節點 :sex
          節點值: 女
          結束節點: sex
          節點值: 
                  
          開始節點 :age
          節點值: 
          21
          結束節點: age
          節點值: 
                  
          開始節點 :
          class
          節點值: 英語四班
          結束節點: 
          class
          節點值: 
              
          結束節點: person
          節點值: 

          結束節點: persons
          ****文檔結束***

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


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

          然后測試各個值,(start,length,及其關系),發現為空值的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("節點值: " + new String(ch,start,length));
                  }
              }
           
          此時問題又出現了,在sex的中length也為1.
          沒辦法修改sex,男修改為man,而女修改為woman。
          得到正確結果
          ***開始***
          開始節點 :persons
          開始節點 :person
          開始節點 :name
          節點值: 劉晨
          結束節點: name
          開始節點 :sex
          節點值: man
          結束節點: sex
          開始節點 :age
          節點值: 
          23
          結束節點: age
          開始節點 :
          class
          節點值: 數學一班
          結束節點: 
          class
          結束節點: person
          開始節點 :person
          開始節點 :name
          節點值: 張鳳
          結束節點: name
          開始節點 :sex
          節點值: woman
          結束節點: sex
          開始節點 :age
          節點值: 
          21
          結束節點: age
          開始節點 :
          class
          節點值: 英語四班
          結束節點: 
          class
          結束節點: person
          結束節點: persons
          ****文檔結束***

          一下是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>數學一班</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的開發包。
          覺得jdom的方法很簡單,類似于jdbc取得數據庫中的數據一樣。

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

          評論

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

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

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

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

          xgdgs  回復  更多評論   

          <2009年2月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          1234567

          導航

          統計

          公告

          welcome to my place.

          常用鏈接

          留言簿(5)

          我參與的團隊

          隨筆分類

          隨筆檔案

          新聞分類

          石頭JAVA擺地攤兒

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          @duduli
          主站蜘蛛池模板: 海林市| 罗甸县| 松滋市| 屏东县| 娄烦县| 屏山县| 奈曼旗| 阜宁县| 泸溪县| 海兴县| 陈巴尔虎旗| 藁城市| 奉贤区| 重庆市| 泸水县| 琼结县| 玉溪市| 邵阳市| 临沭县| 涡阳县| 万安县| 遵化市| 乃东县| 罗江县| 德格县| 天台县| 新和县| 孝感市| 富川| 于都县| 铜川市| 马鞍山市| 裕民县| 全南县| 红原县| 甘德县| 富阳市| 阳新县| 兰州市| 和田县| 伊通|