Java【JDOM】輸入字符串並輸出XML格式的信息

【題目要求】

第一組: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)或者dom4jjar包

(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)),也會拋異常,但會多產生一個對象

 

參考鏈接:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章