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)),也会抛异常,但会多产生一个对象

 

参考链接:

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