<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  回復  更多評論   

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

    導航

    統計

    公告

    welcome to my place.

    常用鏈接

    留言簿(5)

    我參與的團隊

    隨筆分類

    隨筆檔案

    新聞分類

    石頭JAVA擺地攤兒

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    @duduli
    主站蜘蛛池模板: 精品无码AV无码免费专区| 风间由美在线亚洲一区| 久久99热精品免费观看动漫| 亚洲最大av无码网址| 精品韩国亚洲av无码不卡区| 国产免费观看黄AV片| 亚洲成a人无码亚洲成www牛牛| 四虎影院在线免费播放| 亚洲av无码成人影院一区| 国产中文字幕免费观看| 最好2018中文免费视频| 在线观看亚洲成人| 精品在线免费观看| 亚洲欧洲日本国产| 免费人成视频在线| 黄页网址大全免费观看12网站| 亚洲第一页综合图片自拍| 成人国产精品免费视频| 亚洲av无码国产精品色午夜字幕| 国产成人免费视频| 亚洲1234区乱码| 日本特黄特色aa大片免费| 精品久久久久亚洲| 亚洲一级特黄无码片| 日韩电影免费在线观看| 亚洲国产日韩在线成人蜜芽 | 日本中文字幕免费看| 亚洲人成无码网站| 16女性下面扒开无遮挡免费| 亚洲色大成网站www| 亚洲精品国产va在线观看蜜芽| 免费国产污网站在线观看| 亚洲视频一区在线观看| 暖暖在线日本免费中文| 国产JIZZ中国JIZZ免费看| 亚洲精品天天影视综合网| 免费看少妇作爱视频| AAA日本高清在线播放免费观看| 亚洲一卡2卡4卡5卡6卡在线99| 国产伦一区二区三区免费| 日本黄色动图免费在线观看|