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

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

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


    按照所獲將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,及其關系),發(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é)點 :persons
    開始節(jié)點 :person
    開始節(jié)點 :name
    節(jié)點值: 劉晨
    結束節(jié)點: name
    開始節(jié)點 :sex
    節(jié)點值: man
    結束節(jié)點: sex
    開始節(jié)點 :age
    節(jié)點值: 
    23
    結束節(jié)點: age
    開始節(jié)點 :
    class
    節(jié)點值: 數學一班
    結束節(jié)點: 
    class
    結束節(jié)點: person
    開始節(jié)點 :person
    開始節(jié)點 :name
    節(jié)點值: 張鳳
    結束節(jié)點: name
    開始節(jié)點 :sex
    節(jié)點值: woman
    結束節(jié)點: sex
    開始節(jié)點 :age
    節(jié)點值: 
    21
    結束節(jié)點: age
    開始節(jié)點 :
    class
    節(jié)點值: 英語四班
    結束節(jié)點: 
    class
    結束節(jié)點: person
    結束節(jié)點: 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的開發(fā)包。
    覺得jdom的方法很簡單,類似于jdbc取得數據庫中的數據一樣。

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

    評論

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

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

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

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

    xgdgs  回復  更多評論   

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

    導航

    統(tǒng)計

    公告

    welcome to my place.

    常用鏈接

    留言簿(5)

    我參與的團隊

    隨筆分類

    隨筆檔案

    新聞分類

    石頭JAVA擺地攤兒

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    @duduli
    主站蜘蛛池模板: 99精品国产免费久久久久久下载| a级毛片高清免费视频| 亚洲国产精品免费观看| 亚洲色图在线播放| 一级毛片成人免费看免费不卡| 亚洲国产精品无码中文字| 两个人看www免费视频| 亚洲AV综合色区无码一区| 国产免费无码AV片在线观看不卡| 亚洲精品无码国产| 久久国产乱子免费精品| 亚洲av日韩av高潮潮喷无码| 免费视频成人片在线观看| 亚洲日韩国产精品无码av| 免费在线观看的网站| 亚洲欧美乱色情图片| 免费永久看黄在线观看app| 亚洲AV电影天堂男人的天堂| 国产gav成人免费播放视频| 一个人看的www在线免费视频 | 亚洲中文字幕一二三四区| 成人黄软件网18免费下载成人黄18免费视频 | 亚洲欧洲日本精品| 三年片在线观看免费观看高清电影| 在线观看日本亚洲一区| 国产做床爱无遮挡免费视频| 国产免费牲交视频免费播放 | 亚洲日本国产精华液| 全免费a级毛片免费**视频| 一级大黄美女免费播放| 亚洲午夜未满十八勿入| 少妇高潮太爽了在线观看免费 | 巨胸喷奶水www永久免费 | 国产精品久久免费视频| 99视频免费在线观看| 亚洲天堂一区二区三区| 又爽又黄无遮挡高清免费视频| a级毛片免费全部播放无码| 亚洲中文字幕日本无线码| 精品亚洲视频在线观看 | 情人伊人久久综合亚洲|