【題目要求】
第一組:2015 多多 OS 100
第二組:2016 木木 DS 99
第三組:2017 虛虛 SQL 98
把上面的信息輸出爲XML格式的信息,即輸出結果爲(這裏給出XML輸出結果 下面就不再給出了)
<?xml version="1.0" encoding="GBK"?>
<stu_list>
<Student id="2015">
<stuNo>2015</stuNo>
<stuName>多多</stuName>
<lesson>OS</lesson>
<mark>100</mark>
</Student>
<Student id="2016">
<stuNo>2016</stuNo>
<stuName>木木</stuName>
<lesson>DS</lesson>
<mark>99</mark>
</Student>
<Student id="2017">
<stuNo>2017</stuNo>
<stuName>虛虛</stuName>
<lesson>SQL</lesson>
<mark>98</mark>
</Student>
</stu_list>
1、下載jdom、dom4j 並導入jar包
輸出XML格式的信息一般需要使用jdom(jdom2)或者dom4j的jar包
(1)jdom官網下載:http://www.jdom.org (我下面選擇用jdom來完成該題目 所以可以不下載dom4j)
進入頁面後選擇Downloads - Binaries - 選擇一個zip包下載 - 下載完後解壓 - 得到jdom-2.0.6.jar或jdom-1.1.3.jar(版本不同而已)
(2)dom4j官網下載:https://dom4j.github.io 直接選擇下載一個jar包,如dom4j-2.1.1.jar
(3)獲得jdom-2.0.6.jar或jdom-1.1.3.jar、dom4j-2.1.1.jar(適合的版本即可)之後,把jar包導入到項目project中,選擇Project - Properties - Java Build Path - Libraries - Add External JARs
正確導入之後就會看到這樣子的效果
【注意Attention】
在添加外部external的jar包時可以同時添加進項目project,但要注意的是jdom(jdom2)和dom4j的jar包不能同時導入import,會報錯,這是因爲這兩個jar包中都有相同的一些對象,而系統認爲它們是同一個包裏的同一種對象(如Document對象),所以創建時可以選擇其中一個jar包正常導入import,而另外一個在使用它其中的對象時就加上該類所在的包名
比如導入了jdom的jar包,則要使用dom4j中的類時,則可以這樣做(反過來導入dom4j,使用jdom時加上包名也可以)
import org.jdom.Document;
import org.jdom.Element;
Element root = new Element("test");//創建元素名爲test的根元素
Document doc = new Document(root);//此處使用的是jdom中的Document
org.dom4j.Document document = reader.read("res/book.xml");
org.dom4j.Document document = document.getRootElement();
2、寫一個相關的類
具體什麼類就根據你要轉換的XML信息來決定,這裏寫一個Student類,同時生成帶參的構造函數和各種的get、set方法
public class Student {
private int stuNo;
private String stuName;
private String lesson;
private int mark;
public Student() {//無參構造方法
}
public Student(int stuNo, String stuName, String lesson, int mark) {
super();
this.stuNo = stuNo;
this.stuName = stuName;
this.lesson = lesson;
this.mark = mark;
}
public int getStuNo() {
return stuNo;
}
public void setStuNo(int stuNo) {
this.stuNo = stuNo;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getLesson() {
return lesson;
}
public void setLesson(String lesson) {
this.lesson = lesson;
}
public int getMark() {
return mark;
}
public void setMark(int mark) {
this.mark = mark;
}
}
3、轉換成XML格式的信息
先上代碼,再解釋,代碼中有註釋,可以仔細看看
import org.jdom2.Document; //jdom2和dom4j的jar包不能同時導入 會出錯
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import java.util.ArrayList;
import java.util.List;
public class Test1 {
public static void main(String[] args) {
List<Student> stu = new ArrayList<Student>();//使用Student類作爲類型
Student stu1 = new Student(2015, "多多", "OS", 100);
Student stu2 = new Student(2016, "木木", "DS", 99);
Student stu3 = new Student(2017, "虛虛", "SQL", 98);
stu.add(stu1);
stu.add(stu2);
stu.add(stu3);
String resultXml = getXmlFromList(stu); // 根據List數組,生成XML數據
System.out.println(resultXml); // 打印生成的XML數據
}
// 根據List列表封裝成XML數據 返回封裝後的數據
public static String getXmlFromList(List<Student> stu) {
String result = "";
Element root = new Element("stu_list");// 創建元素stu_list——根元素
Document doc = new Document(root);
for (Student student : stu) {
Element element = new Element("Student");
// 先創建元素Student 然後依次在Student中添加子元素stuNo、stuName、lesson、mark
element.setAttribute("id", student.getStuNo() + "");//設置屬性 不需要屬性可以去掉
element.addContent(new Element("stuNo").setText(student.getStuNo() + ""));
element.addContent(new Element("stuName").setText(student.getStuName()));
element.addContent(new Element("lesson").setText(student.getLesson()));
element.addContent(new Element("mark").setText(student.getMark() + ""));
root.addContent(element);// 在元素stu-list中嵌套子元素Student
// addContent:爲元素添加子元素內容,也可以直接添加另一個元素節點
}
XMLOutputter XMLout = new XMLOutputter();
Format format = Format.getPrettyFormat();//創建XML文檔輸出的格式化方式(該格式化方式,用戶可以自定義)
format.setIndent(" ");//使用4個空格進行縮進, 可以兼容文本編輯器
format.setEncoding("GBK");//設置編碼格式
XMLout.setFormat(format);//使XML格式化輸出
try {
result = XMLout.outputString(doc); // 將Document寫入到FileWriter文件流中 輸出XML數據
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
【介紹一下XML】
(如果對XML已經有了解的話就不用看這部分了,如果不瞭解的話最好看一下 可幫助你理解代碼)
(1)什麼是 XML
- XML 指可擴展標記語言,是一種標記語言,很類似 HTML。
- XML 的設計宗旨是傳輸數據,而非顯示數據
- XML 標籤沒有被預定義。需要自行定義標籤。它被設計爲具有自我描述性。
- XML 是不作爲的,沒有任何行爲的。僅僅是純文本。
- XML 很類似 HTML,但不是 HTML 的替代,而是對 HTML 的補充。XML 被設計爲傳輸和存儲數據,其焦點是數據的內容。HTML 被設計用來顯示數據,其焦點是數據的外觀。XML 旨在傳輸信息,而HTML 旨在顯示信息 。
(2)XML文檔的組成
- XML文件是一種典型的樹形文件,每個文檔元素都是一個document元素的子節點。而每個子元素都是一個Element對象,對象可以向下包含。
- XML 文檔中的元素形成了一棵文檔樹(樹結構)。這棵樹從根部開始,並擴展到樹的最底端(擴展到“枝葉”)。XML 文檔必須包含根元素,該元素是所有其他元素的父元素。
- 因此我們可以先通過創建元素再將元素添加到父元素中,最後將頂層元素添加到根元素中。創建完文檔元素後,就可以把元素添加到document對象中,然後寫入文件。
- Document 對象代表整個 XML 文檔,是一棵文檔樹的根,可爲我們提供對文檔數據的最初(或最頂層)的訪問入口。
- Element 對象表示 XML 文檔中的元素,元素可包含屬性、其他元素或文本。
(3)XML 元素必須遵循以下命名規則
- 可使用任何名稱,沒有保留的字詞
- 名稱可以含字母、數字以及其他的字符
- 名稱不能以數字或者標點符號開始
- 名稱不能以字符 “xml”(或者 XML、Xml)開始
- 名稱不能包含空格
當時因爲元素命名錯誤所以運行時報錯,如果報錯會有提示,比如:org.jdom2.IllegalNameException: The name "stu list" is not legal for JDOM/XML elements: XML name 'stu list' cannot contain the character " ".
(4)主要使用的函數:
- Element.setAttribute 爲元素添加信息
- Element.addContent(String,String) 爲元素添加子元素內容,也可以直接添加另一個元素節點
- Document.setRootElement(Element) 爲文檔添加根元素
- XMLOutputter.output(Document,FileWriter) 將Docuemnt寫入到FileWriter文件流中
【解析代碼】
- 首先是創建List數組,把所有數據以Student類作爲對象,加入到stu數組中
- 然後調用生成XML信息的函數,把stu數組作爲參數傳過去
- 創建根元素(Element root),並把根元素加入到Document中
- 遍歷stu數組,每一個Student對象創建一個子元素(Element element),把Student對象中的四個成員變量通過get方法得到相應的值,並生成元素後(new Element),通過addContent加入到element元素中,四個成員變量加入完畢後,把該element元素加入到根元素root中,形成一個子節點
- 遍歷完成後,先生成一個XMLOutputter,然後對其進行格式化(格式化方式在代碼中有解析),格式化後就把Document對象寫入,通過outputString生成XML格式的信息,再打印出來即可
PS:我最上面給出最終的XML信息的標籤都是自定義的,你也可以根據自己需要的信息定義自己的標籤
【科普:String 與 int 互相轉換】
- int 轉爲 String
第一種方法:s = i + ""; //會產生兩個String對象
第二種方法:s = String.valueOf(i); //直接使用String類的靜態方法,只產生一個對象
- String 轉爲 int
第一種方法:i = Integer.parseInt(s); //直接使用靜態方法,不會產生多餘的對象,但會拋出異常
第二種方法:i = Integer.valueOf(s).intValue(); //Integer.valueOf(s) 相當於 new Integer(Integer.parseInt(s)),也會拋異常,但會多產生一個對象
參考鏈接:
- https://www.imooc.com/qadetail/229528?lastmedia=1
- https://www.cnblogs.com/panxuejun/p/6148493.html
- https://www.cnblogs.com/qihuan/p/3796604.html
- https://www.cnblogs.com/signheart/p/6597974.html
- https://www.cnblogs.com/zhi-hao/p/4016363.html
- http://www.w3school.com.cn/xml/index.asp(可系統學習XML)
- http://www.w3school.com.cn/xmldom/index.asp(XML DOM學習)