Demo1
package
com.gxd.xml;
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 elAge1 = elStu1.addElement("age");
elName1.setText("张三");
elAge1.setText("20");
Element elStu2 = root.addElement("student");
Element elName2 = elStu2.addElement("name");
Element elAge2 = elStu2.addElement("age");
elName2.setText("王五");
elAge2.setText("22");
// 这样格式不满意
// PrintWriter pw = new PrintWriter(System.out);
// try {
// doc.write(pw);
// pw.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// 这样格式就满意了
// OutputFormat(空位,是否换行,字符编码);
OutputFormat outfm = new OutputFormat(" ", true, "gb2312");
try ...{
// XMLWriter xmlw = new XMLWriter(outfm);
// 输出至文件
XMLWriter xmlw = new XMLWriter(new FileWriter("dom4jDemo.xml"),
outfm);
xmlw.write(doc);
xmlw.close();
} catch (UnsupportedEncodingException e) ...{
e.printStackTrace();
} catch (IOException e1) ...{
e1.printStackTrace();
}
}
}
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 elAge1 = elStu1.addElement("age");
elName1.setText("张三");
elAge1.setText("20");
Element elStu2 = root.addElement("student");
Element elName2 = elStu2.addElement("name");
Element elAge2 = elStu2.addElement("age");
elName2.setText("王五");
elAge2.setText("22");
// 这样格式不满意
// PrintWriter pw = new PrintWriter(System.out);
// try {
// doc.write(pw);
// pw.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// 这样格式就满意了
// OutputFormat(空位,是否换行,字符编码);
OutputFormat outfm = new OutputFormat(" ", true, "gb2312");
try ...{
// XMLWriter xmlw = new XMLWriter(outfm);
// 输出至文件
XMLWriter xmlw = new XMLWriter(new FileWriter("dom4jDemo.xml"),
outfm);
xmlw.write(doc);
xmlw.close();
} catch (UnsupportedEncodingException e) ...{
e.printStackTrace();
} catch (IOException e1) ...{
e1.printStackTrace();
}
}
}
Dome2
package
com.gxd.xml;
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文档树
*
* @author eastlift
* 此DEMO所用的student.xml内容如下:
* <?xml version="1.0" encoding="utf-8"?>
<students>
<student sn="001">
<name>张三</name>
<age>18</age>
</student>
<student sn="002">
<name>李四</name>
<age>20</age>
</student>
<student sn="003">
<name>王五</name>
<age>19</age>
</student>
</students>
<h2>处理输出结果<h2>:
元素名:students
元素名:student
属性:sn =001
元素名:name 文本 张三
元素名:age 文本 18
元素名:student
属性:sn =002
元素名:name 文本 李四
元素名:age 文本 20
元素名:student
属性:sn =003
元素名:name 文本 王五
元素名:age 文本 19
*/
public class Dom4jVisitorDemo ... {
public static void main(String[] args) ...{
SAXReader saxReder = new SAXReader();
try ...{
Document doc = saxReder.read("student.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("属性:" + 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());
}
}
}
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文档树
*
* @author eastlift
* 此DEMO所用的student.xml内容如下:
* <?xml version="1.0" encoding="utf-8"?>
<students>
<student sn="001">
<name>张三</name>
<age>18</age>
</student>
<student sn="002">
<name>李四</name>
<age>20</age>
</student>
<student sn="003">
<name>王五</name>
<age>19</age>
</student>
</students>
<h2>处理输出结果<h2>:
元素名:students
元素名:student
属性:sn =001
元素名:name 文本 张三
元素名:age 文本 18
元素名:student
属性:sn =002
元素名:name 文本 李四
元素名:age 文本 20
元素名:student
属性:sn =003
元素名:name 文本 王五
元素名:age 文本 19
*/
public class Dom4jVisitorDemo ... {
public static void main(String[] args) ...{
SAXReader saxReder = new SAXReader();
try ...{
Document doc = saxReder.read("student.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("属性:" + 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());
}
}
}
Demo3
package
com.gxd.xml;
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文档如下:
* <?xml version="1.0" encoding="utf-8"?>
<students>
<student sn="001">
<name>张三</name>
<age>18</age>
</student>
<student sn="002">
<name>李四</name>
<age>20</age>
</student>
<student sn="003">
<name>王五</name>
<age>19</age>
</student>
</students>
* 处理结果:
* 001
name-----张三
age-----18
002
name-----李四
age-----20
003
name-----王五
age-----19
* @author eastlift
*
*/
public class Dom4jElementHandler ... {
public static void main(String[] args) ...{
SAXReader saxReader = new SAXReader();
// 两个参数,第一个用于指定元素的路径
//
saxReader.addHandler("/students/student", new studentHandler());
try ...{
saxReader.read(new File("student.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());
}
}
}
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文档如下:
* <?xml version="1.0" encoding="utf-8"?>
<students>
<student sn="001">
<name>张三</name>
<age>18</age>
</student>
<student sn="002">
<name>李四</name>
<age>20</age>
</student>
<student sn="003">
<name>王五</name>
<age>19</age>
</student>
</students>
* 处理结果:
* 001
name-----张三
age-----18
002
name-----李四
age-----20
003
name-----王五
age-----19
* @author eastlift
*
*/
public class Dom4jElementHandler ... {
public static void main(String[] args) ...{
SAXReader saxReader = new SAXReader();
// 两个参数,第一个用于指定元素的路径
//
saxReader.addHandler("/students/student", new studentHandler());
try ...{
saxReader.read(new File("student.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());
}
}
}
这三个Demo均听自孙鑫老师XML讲解后,所练习Demo。