<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(2803) 評論(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
    主站蜘蛛池模板: 免费高清av一区二区三区| 亚洲久悠悠色悠在线播放| 中国黄色免费网站| 91福利免费网站在线观看| 5555在线播放免费播放| 免费观看无遮挡www的视频 | 免费一级不卡毛片| 国产亚洲精久久久久久无码77777 国产亚洲精品成人AA片新蒲金 | 久久精品亚洲日本波多野结衣| 无码精品国产一区二区三区免费| 亚洲一区二区三区深夜天堂| 亚洲成?Ⅴ人在线观看无码| 99re6在线视频精品免费下载| 亚洲精品色播一区二区 | 亚洲另类春色校园小说| 亚洲综合另类小说色区色噜噜| 999国内精品永久免费观看| 国产伦精品一区二区免费| 亚洲一区二区三区成人网站| 中文字幕亚洲日韩无线码| 成人免费看黄20分钟| 国产免费一区二区三区不卡| 亚洲av乱码一区二区三区按摩| 亚洲国产精品无码久久一线| 国产午夜免费秋霞影院| 中国xxxxx高清免费看视频| 一级毛片不卡免费看老司机| 456亚洲人成影院在线观| 亚洲av无码成h人动漫无遮挡| 午夜成年女人毛片免费观看| 久久久久久毛片免费播放| 国产精品免费久久久久电影网| 91在线亚洲综合在线| 久久久久亚洲av无码专区| 国产国拍亚洲精品福利 | 国产精品无码永久免费888| 亚洲人成色4444在线观看| 亚洲日韩中文字幕| 久久久久亚洲精品美女| 成人亚洲性情网站WWW在线观看| 免费无码成人AV片在线在线播放|