四种方式生成xml文件:
DOM、SAX (Java提供)
JDOM、DOM4J (第三方提供)
DOM:
- 创建一个 DocumentBuilderFactory 对象,静态方法newInstance()
- 创建一个 DocumentBuilder 对象,DocumentBuilderFactory实例的newDocumentBuilder()方法
- 通过DocumentBuilder对象调用newDocument方法,返回一个 Document 对象
- 通过Document对象调用creatElement方法,创建一个节点元素,返回 Element 对象
通过Element对象的 appendChild 方法向该元素添加子元素
通过Element对象的 setAttribute 方法,给元素添加属性
…… - 通过 TransformerFactory 的静态方法newInstance(),创建TransformerFactory对象
- 通过TransformerFactory的newTransformer(),创建 Transformer 对象
- Transformer对象的setOutputProperty(OutputKeys.INDENT,”yes”)方法可以用来换行(可选)
- 调用Transformer的 transform ()方法将创建的XML转换成Result,Result可通过new File()构建输出文件
/**
* DOM方式创建xml文件
* @param file 文件
* @throws Exception
*/
public static void main(String [] args) {
DOMcreate(new File("dom.xml"));
}
public static void DOMcreate(File file)throws Exception{
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
Document document=db.newDocument();
document.setXmlStandalone(true);
Element root=document.createElement("tb_student");
for (int i = 0; i < 3; i++) {
Element student=document.createElement("student");
Element name=document.createElement("name"),
age=document.createElement("age"),
grade=document.createElement("grade");
student.setAttribute("id", i+"");
name.setTextContent("张"+i);
age.setTextContent(""+i*5);
grade.setTextContent(""+i*20);
student.appendChild(name);
student.appendChild(age);
student.appendChild(grade);
root.appendChild(student);
}
document.appendChild(root);
TransformerFactory tff=TransformerFactory.newInstance();
Transformer tf=tff.newTransformer();
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.transform(new DOMSource(document), new StreamResult(file));
}
SAX:
- 用ArrayList存储xml所需的对象集合
- 通过SAXTransformerFactory的静态方法newInstance()创建一个 SAXTransformerFactory 对象
- 通过SAXTransformerFactory对象的newTransformerHandler()创建一个 TransformerHandler 对象
- 通过TransformerHandler对象的getTransformer()创建一个 Transformer 对象
- Transformer对象的setOutputProperty(OutputKeys.INDENT,”yes”)可以实现换行(可选)
- Transformer对象的setOutputProperty(OutputKeys.ENCODING,”编码名称”)可以实现编码格式(可选)
- 创建 Result 对象,并使用TransformerHandler对象的 setResult (Result)方法使其与TransformerHandler关联
- 使用TransformerHandler对象的进行xml文件内容的编写(遍历ArrayList创建各个节点)
startDocument();//开始文档
endDocument();//结束文档
startElement(String uri,String localName,String qName,Attributes atts);//元素标签开始
endElement(String uri,String localName,String qName,Attributes atts);//元素标签结束
/**
* SAX方式创建xml文件
* @param file
* @throws Exception
*/
public static void SAXcreate(File file)throws Exception {
//初始化要生成文件的数据
ArrayList<Student> students=new ArrayList<Student>();
for (int i = 0; i < 3; i++) {
Student student=new Student(i,"张"+i,5*i,10*i);
students.add(student);
}
SAXTransformerFactory stf=(SAXTransformerFactory) SAXTransformerFactory.newInstance();
TransformerHandler handler=stf.newTransformerHandler();
Transformer tf=handler.getTransformer();
tf.setOutputProperty(OutputKeys.INDENT, "yes");//标签自动换行
tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");//编码格式
StreamResult result=new StreamResult(file);//创建Result对象
handler.setResult(result);//关联
handler.startDocument();
handler.startElement("", "", "tb_students", null);//根节点标签
for (Student student : students) {
AttributesImpl atts=new AttributesImpl();//创建熟悉
atts.addAttribute("", "", "id", "", student.getId()+"");
handler.startElement("", "", "student", atts);//元素标签开始
handler.startElement("", "", "name", null);//元素标签开始
handler.characters(student.getName().toCharArray(), 0, student.getName().length());//元素标签内容
handler.endElement("", "", "name");//元素标签结束
handler.startElement("", "", "age", null);
handler.characters((""+student.getAge()).toCharArray(), 0, (""+student.getAge()).length());
handler.endElement("", "", "age");
handler.startElement("", "", "grade", null);
handler.characters((""+student.getGrade()).toCharArray(), 0,(""+student.getGrade()).toCharArray().length);
handler.endElement("", "", "grade");
handler.endElement("", "", "student");//元素标签结束
}
handler.endElement("", "", "tb_students");//结束根节点标签
handler.endDocument();
}
实体类student
package entity;
public class Student {
private int id;
private String name;
private int age;
private int grade;
public Student() {
// TODO Auto-generated constructor stub
}
public Student(int id, String name, int age, int grade) {
super();
this.id = id;
this.name = name;
this.age = age;
this.grade = grade;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
}
DOM4J:
- 通过 DocumentHelper 的静态方法 createDocument 创建一个 Document 对象
- 创建节点:Document对象的 addElement 方法 返回Element对象
- 节点添加属性:Element对象的 addAttribute 方法
节点添加内容:Element对象的 setText 、 add 方法 - 创建 XMLWriter 对象 (new) (可使用输出流、OutputFormat作为参数,分别给出输出地址和格式)
XMLWriter对象的setEscapeText方法可以设置字符是否转义,默认true(转义) - 调用XMLWriter对象的 write 方法,Document对象作为参数
- 关闭XMLWriter对象,以及相关资源的 close 操作
/**
* DOM4J方式创建xml文件
* @param file
* @throws Exception
*/
public static void DOM4Jcreate(File file)throws Exception{
org.dom4j.Document document=DocumentHelper.createDocument();
org.dom4j.Element root=document.addElement("rss");
root.addAttribute("version", "2.0");
org.dom4j.Element channel=root.addElement("channel");
org.dom4j.Element title=channel.addElement("title");
title.setText("新闻国内");
//...
XMLWriter writer=new XMLWriter(new FileOutputStream(file),OutputFormat.createPrettyPrint());
writer.setEscapeText(false);//字符是否转义,默认true
writer.write(document);
writer.close();
}
注:此处模拟的是一个”rss”文件的生成部分代码, RSS(Really Simple Syndication) 是一种描述和同步网站内容的格式,是使用最广泛的XML应用。
JDOM:
- 创建 Document 对象 (new)
- 创建 Element 对象 (new) 并向其中添加属性/内容/子节点
- 向Document对象中添加Element节点 addContent / setContent
(或者创建Document对象时将Element对象作为参数等) - 创建 XMLOutputter 对象 (new) 并调用 output 方法生成xml文档
/**
* JDOM方式创建xml文件
* @param file
* @throws Exception
*/
public static void JDOMcreate(File file)throws Exception{
org.jdom2.Document document=new org.jdom2.Document();
org.jdom2.Element root=new org.jdom2.Element("rss");
root.setAttribute("version", "2.0");
root.addContent(
new org.jdom2.Element("channel").addContent(
new org.jdom2.Element("title").setText("新闻国内")));
document.setRootElement(root);
XMLOutputter outputter=new XMLOutputter();
outputter.setFormat(Format.getPrettyFormat());//设置文本格式
outputter.output(document, new FileOutputStream(file));
}