前面两篇关于DOM和SAX解析都是官方提供的xml解析和创建方式。
DOM——基于树结构
SAX——基于事件
JDOM/DOM4J——基于底层API,即DOM和SAX。
下面两种解析和生成方式是基于底层API(DOM和SAX)的非官方的生成方式。这篇我们先测试JDOM。(其中student和xml文件,参考dom篇)
JDOMHelper.java
public class JDOMHelper {
public List<Student> parseXML() {
List<Student> students = new ArrayList<Student>();
Student student = null;
// 导入jdom.jar包
// 1.创建一个SAXBuilder对象
SAXBuilder saxBuilder = new SAXBuilder();
// 创建一个输入流的引用
InputStream in;
try {
// 2.创建一个输入流,将xml文件加载到输入流中
in = new FileInputStream("data/student.xml");
// 3.通过saxBuilder的build方法,将输入流加载到saxBuilder中
Document document = saxBuilder.build(in);
// 4.通过document对象获得xml文件的根节点
Element rootElement = document.getRootElement();
// 5.获取根节点下的子节点的List集合
List<Element> studs = rootElement.getChildren();
// 对节点集合进行遍历
for(Element stud : studs) {
// 每一个student节点创建一个student对象
student = new Student();
// 获得student节点的属性
List<Attribute> attrs = stud.getAttributes();
// 遍历属性集合
for(Attribute attr : attrs) {
// studNo属性
if(attr.getName().equals("studNo")) {
student.setStudNo(Integer.parseInt(attr.getValue()));
// name属性
} else if(attr.getName().equals("name")) {
student.setName(attr.getValue());
}
}
List<Element> childs = stud.getChildren();
for(Element child : childs) {
if(child.getName().equals("sex")) {
student.setSex(child.getValue());
} else if(child.getName().equals("age")) {
student.setAge(Integer.parseInt(child.getValue()));
} else if(child.getName().equals("home")) {
student.setHome(child.getValue());
} else if(child.getName().equals("single")) {
student.setSingle(child.getValue().equals("单身"));
}
}
students.add(student);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return students;
}
public void creatXML(List<Student> students) {
// 生成一个根节点
Element studs = new Element("students");
// 利用根节点生成一个document对象
Document document = new Document(studs);
// 遍历student集合
for(Student student : students) {
// 对集合中的每一个student对象创建标签
Element stud = new Element("student");
// 给student标签添加属性
stud.setAttribute("studNo", String.valueOf(student.getStudNo()));
stud.setAttribute("name", student.getName());
// 子标签age
Element age = new Element("age");
age.addContent(String.valueOf(student.getAge()));
stud.addContent(age);
// 子标签sex
Element sex = new Element("sex");
sex.addContent(student.getSex());
stud.addContent(sex);
// 子标签home
if(student.getHome() != null) {
Element home = new Element("home");
home.addContent(student.getHome());
stud.addContent(home);
}
// 子标签single
if(student.isSingle()) {
Element single = new Element("single");
single.addContent("单身");
stud.addContent(single);
}
studs.addContent(stud);
}
// 获得xml格式设置对象
Format format = Format.getCompactFormat();
// 设置编码
format.setEncoding("UTF-8");
// 设置换行
format.setIndent("");
// 用格式构造XMLOutputter对象
XMLOutputter outPutter = new XMLOutputter(format);
try {
// 将dom树写进xml文件
outPutter.output(document, new FileOutputStream(new File("data/student1.xml")));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
对方法进行测试的代码如下:
public class JDOMHelperTest {
public static void main(String[] args) {
JDOMHelper jdom = new JDOMHelper();
List<Student> students = jdom.parseXML();
jdom.creatXML(students);
for(Student student : students) {
System.out.println(student);
}
}
}
以上是我学习时的实验,有什么不对的地方,敬请指正。本人将不胜感激!