2.使用jaxp的一個案例(我的JavaEE筆記)

這里我們給出一份xml文檔,里面存有一些學生的相關(guān)信息震桶,我們需要對這份文檔進行相關(guān)的解析尖奔。

1.首先給出student.xml

(xml/student.xml)

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<exam>
    <student examid="222" idcard="111">
        <name>張三</name>
        <location>沈陽</location>
        <grade>89</grade>
    </student>
    
    <student examid="444" idcard="333">
        <name>李四</name>
        <location>大連</location>
        <grade>97</grade>
    </student>


    <student examid="5555" idcard="5555">
        <name>阿貓</name>
        <location>西安</location>
        <grade>86.0</grade>
    </student>
    
</exam>

2.學生實體類

(src/cn.itcast.domain.Student.java)

package cn.itcast.domain;

public class Student {
    private String examId;
    private String idcard;
    private String name;
    private String location;
    private double grade;
    
    
    public String getExamId() {
        return examId;
    }
    public void setExamId(String examId) {
        this.examId = examId;
    }
    public String getIdcard() {
        return idcard;
    }
    public void setIdcard(String idcard) {
        this.idcard = idcard;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getLocation() {
        return location;
    }
    public void setLocation(String location) {
        this.location = location;
    }
    public double getGrade() {
        return grade;
    }
    public void setGrade(double grade) {
        this.grade = grade;
    }
        
}

3.工具類

(src/cn.itcast.utils.XmlUtils.java)

package cn.itcast.utils;
import java.io.File;
import javax.management.RuntimeErrorException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import cn.itcast.domain.Student;

public class XmlUtils {
    //將xml文檔讀到內(nèi)存中
    public static Document getDocument() throws Exception{
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(new File("xml/student.xml"));
        
        return document;
    }
    
    //將修改過的文檔從內(nèi)存中寫到實際的xml文檔中
    public static void writeDocument(Document document) throws Exception{
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer();
        transformer.transform(new DOMSource(document), new StreamResult(new File("xml/student.xml")));
    }
    
    //添加學生
    public void addStudent(Student student){
        try{
            Document document = XmlUtils.getDocument();
            //得到exam節(jié)點
            Node parent = document.getElementsByTagName("exam").item(0);
            //構(gòu)造一個學生節(jié)點
            Element child = document.createElement("student");
            child.setAttribute("examId", student.getExamId());
            child.setAttribute("idcard", student.getIdcard());
            
            Element name = document.createElement("name");
            name.setTextContent(student.getName());
            
            Element location = document.createElement("location");
            location.setTextContent(student.getLocation());
            
            Element grade = document.createElement("grade");//注意:分數(shù)是double型的,需要轉(zhuǎn)換成字符串
            grade.setTextContent(student.getGrade() + "");
            
            child.appendChild(name);
            child.appendChild(location);
            child.appendChild(grade);
            parent.appendChild(child);
            
            //將內(nèi)存中的內(nèi)容寫到xml文檔中去
            XmlUtils.writeDocument(document);   
        }catch(Exception e){
            throw new RuntimeException("錄入失敾Ρ获洲!");
        }
    }
    
    //刪除學生
    public void deleteStudent(String name) {
        try{
            Document document = XmlUtils.getDocument();
            NodeList list = document.getElementsByTagName("name");
            for(int i = 0; i < list.getLength(); i++){
                Node node = list.item(i);
                if(node.getTextContent().equals(name)){
                    //這里是刪除student節(jié)點,即name的父節(jié)點
                    node.getParentNode().getParentNode().removeChild(node.getParentNode());
                    XmlUtils.writeDocument(document);
                    return;
                }
            }
            throw new RuntimeException("您要刪除的學生不存在5钊纭9鄙骸!");
        }catch(Exception e){
            throw new RuntimeException("刪除失斏婺佟C挪怼!烤送!");
        }   
    }
    
    //查找學生
    public Student findStudent(String examid){
        try {
            Document document = XmlUtils.getDocument();
            NodeList list = document.getElementsByTagName("student");
            for(int i = 0; i < list.getLength(); i++){
                //因為document中沒有取得屬性值的方法寒随,所以要轉(zhuǎn)換成Element對象
                
                Element element = (Element) list.item(i);//取得其中一個學生節(jié)點
                
                if(element.getAttribute("examid").equals(examid)){
                    Student student = new Student();
                    student.setExamId(examid);
                    student.setIdcard(element.getAttribute("idcard"));
                    student.setName(element.getElementsByTagName("name").item(0).getTextContent());
                    student.setLocation(element.getElementsByTagName("location").item(0).getTextContent());
                    student.setGrade(Double.parseDouble(element.getElementsByTagName("grade").item(0).getTextContent()));
                    
                    return student;
                    
                }
            }
            return null;
        } catch (Exception e) {
            throw new RuntimeException("沒有您想要查找的學生!0锛帷牢裳!");
        }   
    }
}

4.測試類

(src/cn.itcast.Demo2.java)

package cn.itcast;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.junit.Test;
import cn.itcast.domain.Student;
import cn.itcast.utils.XmlUtils;
public class Demo2 {

    public static void main(String[] args) throws Exception{
        System.out.println("(a)添加                (b)刪除              (c)查找");
        System.out.println("請輸入您操作類型代號:");
        
        BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
        
        String type = buffer.readLine();
        //添加
        if(type.equalsIgnoreCase("a")){
            try{
                Student stu = new Student();
                System.out.println("請輸入學生的姓名:");
                stu.setName(buffer.readLine());
                
                System.out.println("請輸入學生的準考證號:");
                stu.setExamId(buffer.readLine());
                
                System.out.println("請輸入學生的身份證號:");
                stu.setIdcard(buffer.readLine());
                
                System.out.println("請輸入學生的地址:");
                stu.setLocation(buffer.readLine());
                
                System.out.println("請輸入學生的分數(shù):");
                stu.setGrade(Double.parseDouble(buffer.readLine()));
                XmlUtils utils = new XmlUtils();
                utils.addStudent(stu);
                System.out.println("錄入成功!");
            }catch(Exception e){
                System.out.println(e.getMessage());
            }
        //刪除
        }else if(type.equalsIgnoreCase("b")){
            try{
                System.out.println("請輸入您要刪除學生的名字:");
                String name = buffer.readLine();
                XmlUtils utils = new XmlUtils();
                utils.deleteStudent(name);
                System.out.println("刪除成功叶沛!");
            }catch(Exception e){
                System.out.println(e.getMessage());
            }
        //查找
        }else if(type.equalsIgnoreCase("c")){
            try{
                System.out.println("請輸入您想要查找學生的準考證號:");
                String examid = buffer.readLine();
                Student student = new Student();
                XmlUtils utils = new XmlUtils();
                student = utils.findStudent(examid);
                System.out.println("您要找的學生的信息如下:");
                System.out.println("學生姓名:" + student.getName());
                System.out.println("學生準考證號:" + student.getExamId());
                System.out.println("學生身份證號:" + student.getIdcard());
                System.out.println("學生地址:" + student.getLocation());
                System.out.println("學生分數(shù):" + student.getGrade());
                
            }catch(Exception e){
                System.out.println("查找學生失斊蜒丁!");
            }
        }else{
            System.out.println("沒有您想要的操作;沂稹E邪铩!");
        }
    }
}

注意:這里我們需要注意刪除學生的時候溉箕。而在異常拋出的時候我們需要注意拋出什么樣的異常晦墙。而工具類中向上拋出的時候是拋到了測試類中了,我們使用e.getMessage()方法獲得拋過來的異常消息肴茄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晌畅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子寡痰,更是在濱河造成了極大的恐慌抗楔,老刑警劉巖棋凳,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異连躏,居然都是意外死亡剩岳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門入热,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拍棕,“玉大人,你說我怎么就攤上這事勺良〈虏ィ” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵尚困,是天一觀的道長幅垮。 經(jīng)常有香客問我,道長尾组,這世上最難降的妖魔是什么忙芒? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮讳侨,結(jié)果婚禮上呵萨,老公的妹妹穿的比我還像新娘。我一直安慰自己跨跨,他們只是感情好潮峦,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著勇婴,像睡著了一般忱嘹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耕渴,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天拘悦,我揣著相機與錄音,去河邊找鬼橱脸。 笑死础米,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的添诉。 我是一名探鬼主播屁桑,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼栏赴!你這毒婦竟也來了蘑斧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竖瘾,沒想到半個月后沟突,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡准浴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了捎稚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乐横。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖今野,靈堂內(nèi)的尸體忽然破棺而出葡公,到底是詐尸還是另有隱情,我是刑警寧澤条霜,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布催什,位于F島的核電站,受9級特大地震影響宰睡,放射性物質(zhì)發(fā)生泄漏蒲凶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一拆内、第九天 我趴在偏房一處隱蔽的房頂上張望旋圆。 院中可真熱鬧,春花似錦麸恍、人聲如沸灵巧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刻肄。三九已至,卻和暖如春融欧,著一層夾襖步出監(jiān)牢的瞬間敏弃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工噪馏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留权她,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓逝薪,卻偏偏與公主長得像隅要,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子董济,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法步清,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法廓啊,異常的語法欢搜,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,811評論 0 11
  • 一:java概述:1,JDK:Java Development Kit谴轮,java的開發(fā)和運行環(huán)境炒瘟,java的開發(fā)工...
    ZaneInTheSun閱讀 2,650評論 0 11
  • 一直想拾筆寫作,但不知道該怎么開始第步,直到有人推薦了一些寫作的APP疮装,其中首推的就是【簡書】,才覺得可以準備開始...
    悅悅_961b閱讀 309評論 0 0
  • 建立一個標準粘都,不僅是為重復的行為設(shè)置流程方案廓推,更是在這個領(lǐng)域里面成為分析總結(jié)達人的必經(jīng)之路。 你的工作翩隧、學習和生活...
    芭菲小鹿閱讀 200評論 0 1