声明:(此文章转载而来,当个人学习记录与积累,纯学习--小菜鸟)
1.生成xml文件
package com.xml.test;
import java.io.FileWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
/**
* 使用Dom4j API构建一个Dom4j树,输出为一个XML文档
* @author eastlift
*
*/
public class Dom4jDemo {
public static void main(String[] args) {
Document doc = DocumentHelper.createDocument();
// public Document addProcessingInstruction(String target,
// String text)
// 添加预处理指令
doc.addProcessingInstruction("xml-stylesheet", "type='text/xsl href='student.xsl'");
Element root = doc.addElement("students");
Element elStu1 = root.addElement("student");
Element elName1 = elStu1.addElement("name");
Element elGender = elStu1.addElement("gender");
Element elAge1 = elStu1.addElement("age");
elName1.setText("张三");
elGender.setText("男");
elAge1.setText("20");
Element elStu2 = root.addElement("student");
Element elName2 = elStu2.addElement("name");
Element elGender2 = elStu2.addElement("gender");
Element elAge2 = elStu2.addElement("age");
elName2.setText("王五");
elGender2.setText("女");
elAge2.setText("22");
// OutputFormat(空位,是否换行,字符编码);
OutputFormat outfm = new OutputFormat(" ", true, "utf-8");
try {
// 输出至文件
XMLWriter xmlw = new XMLWriter(new FileWriter("f://dom4jDemo.xml"), outfm);
xmlw.write(doc);
xmlw.close();
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
catch (IOException e1) {
e1.printStackTrace();
}
}
}
2.解析(第一种)
package com.xml.test;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.ProcessingInstruction;
import org.dom4j.VisitorSupport;
import org.dom4j.io.SAXReader;
/**
* 利用访问者模式,遍历XML文档树
*/
public class Dom4jVisitorDemo {
public static void main(String[] args) {
SAXReader saxReder = new SAXReader();
try {
Document doc = saxReder.read("f:\\dom4jDemo.xml");
doc.accept(new myVisitor());
}
catch (DocumentException e) {
e.printStackTrace();
}
}
/**
* 访问者, 定义成了内部类,继承VisitorSupport,重写需要的方法 VisitorSupport 实现了 Visitor接口
*
* @author eastlift
*
*/
private static class myVisitor extends VisitorSupport {
public void visit(Attribute note) {
System.out.println("-=");
System.out.println("属性:" + note.getName() + " =" + note.getValue());
}
public void visit(Element note) {
// 判断这个元素是否是只有文本内容,
// 如果有文本内容则将文本内容和元素名称打印出来,
// 否则只将元素名称打印出来
if (note.isTextOnly()) {
System.out.println("元素名:" + note.getName() + " 文本 " + note.getText());
}
else {
System.out.println("元素名:" + note.getName());
}
}
// 处理指令
public void visit(ProcessingInstruction pi) {
System.out.println("处理指令:" + pi.getTarget() + " " + pi.getText());
}
}
}
3.解析(第二种)
package com.xml.test;
import java.io.File;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.ElementHandler;
import org.dom4j.ElementPath;
import org.dom4j.io.SAXReader;
/**
* Dom4j支持对文档的基于事件的处理。
* 对于较大的XML文档,我们可以利用Dom4j的基于事件处理的模型,在解析的过程中进行处理,而不必等到整个文档解析完再处理。
* 一个元素,对应一个ElementHandler
* ElementHandler是一个接口,里面有两个方法,当元素的标签开始时调用onStart(),结束时调用onEnd() 此DEMO的XML文档如下:
*
*/
public class Dom4jElementHandler {
public static void main(String[] args) {
SAXReader saxReader = new SAXReader();
// 两个参数,第一个用于指定元素的路径
//
saxReader.addHandler("/students/student", new studentHandler());
try {
saxReader.read(new File("F:\\dom4jDemo.xml"));
}
catch (DocumentException e) {
e.printStackTrace();
}
}
private static class studentHandler implements ElementHandler {
public void onStart(ElementPath path) {
Element elt = path.getCurrent();
System.out.println(elt.attributeValue("sn"));
// 两个参数,第一个用于指定元素的路径,可以用相对路径,也可以用相对路径
path.addHandler("name", new nameHandler());
}
public void onEnd(ElementPath path) {
path.removeHandler("name");
}
}
private static class nameHandler implements ElementHandler {
public void onStart(ElementPath path) {
// 两个参数,第一个用于指定元素的路径,这里用了绝对路径,绝对路径是以 "/"开头的
path.addHandler("/students/student/age", new ageHandler());
}
public void onEnd(ElementPath path) {
Element elt = path.getCurrent();
System.out.println(elt.getName() + "-----" + elt.getText());
path.removeHandler("age");
}
}
private static class ageHandler implements ElementHandler {
public void onStart(ElementPath path) {
}
public void onEnd(ElementPath path) {
Element elt = path.getCurrent();
System.out.println(elt.getName() + "-----" + elt.getText());
}
}
}
本文详细介绍了如何使用Dom4j API构建XML文档,并提供了两种解析XML文档的方法。第一种方法使用访问者模式遍历XML文档树,第二种方法采用基于事件的处理模型在解析过程中进行处理。
234

被折叠的 条评论
为什么被折叠?



