Java【JDOM】解析XML文档并输出字符串

在上一篇博客中写到,用Java【JDOM】把输入的字符串以XML信息的格式输出:点击查看文章——Java【jdom】输入字符串并输出XML格式的信息

在这篇博客中,我将要写到,用Java【JDOM】把XML信息输出成字符串,其他方式可参考博客最下面链接中的文章

【解析XML的方式有以下四种】

  • DOM方式解析XML
    Dom解析是将xml文件全部载入到内存,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件,与平台无关,java提供的一种基础的解析XML文件的API,理解较简单,但是由于整个文档都需要载入内存,不适用于文档较大时。
  • SAX方式解析XML
    基于事件驱动,逐条解析,适用于只处理xml数据,不易编码,而且很难同时访问同一个文档中的多处不同数据
  • JDOM方式解析XML
    简化与XML的交互并且比使用DOM实现更快,仅使用具体类而不使用接口因此简化了API,并且易于使用
  • DOM4j方式解析XML
    JDOM的一种智能分支,功能较强大,建议熟练使用

 

已知XML信息如下



    
        2015
        多多
        OS
        100
    
    
        2016
        木木
        DS
        99
    
    
        2017
        虚虚
        SQL
        98
    

则所要输出的结果为(结果的形式可以自己自定义 这里主要讲解如何提取出XML中的信息)

2015 多多 OS 100
2016 木木 DS 99
2017 虚虚 SQL 98

 

先定义一个Student类——对应于XML信息

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;
	}
	
}

先上代码,在后面写解析,代码中的注释有助于帮你理解,注意看,如果对XML的结构不太了解的,把我在这篇博客一开始贴出来的链接(我的上一篇博客)中介绍XML的部分看一下,对于理解代码会有很大的帮助

import java.io.*;

import org.jdom2.*;
import org.jdom2.input.SAXBuilder;

import java.util.List;
import java.util.ArrayList;

public class Test1 {

	private static List stu = new ArrayList();// 用来存放所有从XML解析出来的Student对象

	public static void main(String[] args) throws Exception {
		String path = ".\\XML_mess.xml";
		process_XML(path);
		print();// 输出stu数组
	}

	public static void process_XML(String path) {
		try {
			SAXBuilder saxBuilder = new SAXBuilder();// SAXBuilder是一个JDOM解析器
			// SAXBuilder将路径中的XML文件解析为Document对象
			Document document = saxBuilder.build(new FileInputStream(path));
			Element root = document.getRootElement();// 获取根节点
			List rootChild = root.getChildren();// 获取根节点的子节点 返回子节点的数组

			for (Element stuChild : rootChild) {
				Student student = new Student();
				/* //若子节点没有属性就不用写这段了
				 * List stuAttribute = element.getAttributes();//获取每个Student的属性
				 * for(Attribute attribute:stuAttribute) {
				 * 		if(attribute.getName().equals("id")) { //一个名为id的属性
				 * 			String id = attribute.getValue();
				 * 			student.setId(id); 
				 * 		} 
				 * }
				 */
				// 获取stuChild的所有子节点
				List childs = stuChild.getChildren();
				for (Element child : childs) {
					if (child.getName().equals("stuNo"))
						student.setStuNo(Integer.parseInt(child.getValue()));
					else if (child.getName().equals("stuName"))
						student.setStuName(child.getValue());
					else if (child.getName().equals("lesson"))
						student.setLesson(child.getValue());
					else if (child.getName().equals("mark"))
						student.setMark(Integer.parseInt(child.getValue()));
				}
				stu.add(student);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void print() {
		// Iterator iter = stu.iterator(); while(iter.hasNext()) iter.next();
		for (int i = 0; i < stu.size(); i++) {
			Student s = stu.get(i);
			String mess = s.getStuNo() + " " + s.getStuName() + " " + s.getLesson() + " " + s.getMark();
			System.out.println(mess);
			// System.out.println(s);
			// 若直接输出对象s 会得到对象的toString()
			// toString():getClass().getName() + "@" + Integer.toHexString(hashCode())
		}
	}
}

【代码解析】

  • 首先用 JDOM 解析器——SAXBuilder,把路径中的 XML 文件解析为 Document 对象
  • 用 Document 的 getRootElement() 方法获取根节点Element root
  • 用 Element 的 getChildren() 方法获取根节点 root 的所有子节点 rootChild
  • 对这些子节点 rootChild 进行遍历,然后在每个遍历中定义一个无参的 Student 对象,用来存储接下来每个 stuChild 中所有用 getChildren() 提取出来的子节点 childs 的信息
  • 遍历 childs 信息,把对应信息用 set 方法存储到 Student 对象中,并把该 Student 对象加入到 stu 数组中
  • 最后用 print() 方法把 stu 数组中的信息按照自己需要的格式打印出来或者可以写入txt文件中

PS:其中遇到的一个报错Error:1 字节的 UTF-8 序列的字节 1 无效。——原因:主要是因为编码格式没搞对,如果有中文则XML信息的编码格式要使用GBK

参考连接:https://blog.csdn.net/zflovecf/article/details/78908788(该链接有用四种方法来解析的 需要可以看看)

你可能感兴趣的:(Java)