种方式生成xml文件:
DOM、(Java提供)
SAX(Java提供) ---------用了这个
JDOM、DOM4J(第三方提供)
- 创建一个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
*/
publicstaticvoid 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();
Transformertf=tff.newTransformer();
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.transform(new DOMSource(document), new StreamResult(file));
}
- 用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
*/
publicstaticvoid 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=newStreamResult(file);//创建Result对象
handler.setResult(result);//关联
handler.startDocument();
handler.startElement("", "", "tb_students", null);//根节点标签
for (Student student : students) {
AttributesImpl atts=newAttributesImpl();//创建熟悉
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;
publicclassStudent {
privateint id;
private String name;
privateint age;
privateint grade;
public Student() {
// TODOAuto-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;
}
publicint getId() {
return id;
}
publicvoid setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
publicvoid setName(String name) {
this.name = name;
}
publicint getAge() {
return age;
}
publicvoid setAge(int age) {
this.age = age;
}
publicint getGrade() {
return grade;
}
publicvoid setGrade(int grade) {
this.grade = grade;
}
}
- 通过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
*/
publicstaticvoid 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(newFileOutputStream(file),OutputFormat.createPrettyPrint());
writer.setEscapeText(false);//字符是否转义,默认true
writer.write(document);
writer.close();
}
注:此处模拟的是一个”rss”文件的生成部分代码,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用。
- 创建Document对象 (new)
- 创建Element对象 (new) 并向其中添加属性/内容/子节点
- 向Document对象中添加Element节点 addContent/setContent
(或者创建Document对象时将Element对象作为参数等) - 创建XMLOutputter对象 (new) 并调用output方法生成xml文档
/**
* JDOM方式创建xml文件
* @param file
* @throws Exception
*/
publicstaticvoid JDOMcreate(File file)throws Exception{
org.jdom2.Document document=new org.jdom2.Document();
org.jdom2.Element root=neworg.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));
}
===================================================================
生成完之后是读取
====================================================================
android开发里经常会遇到后台传来xml格式的数据,需要我们把它们解析后变成对象或者集合, dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、所以我们用dom4j解析xml,把其转化为对象,或者集合,使用之前导入dom4j.jar架包
1、把下面的xml 转化为person的对象
[html] view plain copy
1. <resp>
2. <name>jack</name>
3. <age>21</age>
4. <birthday>1990-02-01</birthday>
5. <sex>man</sex>
6. </resp>
2、把下面的xml 转化为person集合
[html] view plain copy
1. <resp>
2. <desc>0</desc>
3. <depict>ok</depict>
4. <content>
5. <name>jack</name>
6. <age>21</age>
7. <birthday>1990-02-01</birthday>
8. <sex>man</sex>
9. </content>
10. <content>
11. <name>jack</name>
12. <age>21</age>
13. <birthday>1990-02-01</birthday>
14. <sex>man</sex>
15. </content>
16. <content>
17. <name>jack</name>
18. <age>21</age>
19. <birthday>1990-02-01</birthday>
20. <sex>man</sex>
21. </content>
22. </resp>
下面直接贴代码了:
Person类:
[java] view plain copy
1. public class Person {
2.
3. private String name;
4. private String age;
5. private String birthday;
6. private String sex;
7. public String getName() {
8. return name;
9. }
10. public void setName(String name) {
11. this.name = name;
12. }
13. public String getAge() {
14. return age;
15. }
16. public void setAge(String age) {
17. this.age = age;
18. }
19. public String getBirthday() {
20. return birthday;
21. }
22. public void setBirthday(String birthday) {
23. this.birthday = birthday;
24. }
25. public String getSex() {
26. return sex;
27. }
28. public void setSex(String sex) {
29. this.sex = sex;
30. }
31.
Dom4jUtil类
[java] view plain copy
1. import java.io.StringReader;
2. import java.util.ArrayList;
3. import java.util.HashMap;
4. import java.util.Iterator;
5. import java.util.List;
6. import java.util.Map;
7.
8. import org.dom4j.Document;
9. import org.dom4j.DocumentException;
10. import org.dom4j.DocumentHelper;
11. import org.dom4j.Element;
12. import org.dom4j.io.SAXReader;
13. import org.xml.sax.InputSource;
14.
15. public class Dom4jUtil {
16.
17. /**
18. * @param args
19. * @throws DocumentException
20. */
21. public static void main(String[] args) throws DocumentException {
22. // TODO Auto-generated method stub
23.
24. String xml = "<resp>" + "<name>jack</name>" + "<age>21</age>"
25. + "<birthday>1990-02-01</birthday>" + "<sex>man</sex>"
26. + "</resp>";
27. Person student = getPerson(xml);
28. System.out.println(student.getName() + "|" + student.getAge() + "|"
29. + student.getBirthday() + "|" + student.getSex());
30. System.out.println("person对象");
31. String modelXMl = "<name>jack</name>" + "<age>21</age>"
32. + "<birthday>1990-02-01</birthday>" + "<sex>man</sex>";
33. String xmlList = "<resp>" + "<desc>0</desc>" + "<depict>ok</depict>"
34. + "<content>" + modelXMl + "</content>" + "<content>"
35. + modelXMl + "</content>" + "<content>" + modelXMl
36. + "</content>" + "</resp>";
37. System.out.println("person集合列表");
38. List<Person> list = getPersonList(xmlList);
39. for (Person person : list) {
40. System.out.println(person.getName() + "|" + person.getAge() + "|"
41. + person.getBirthday() + "|" + person.getSex());
42. }
43. }
44.
45. /**
46. * 把xml格式转化为person对象
47. *
48. * @param xml
49. * @return
50. */
51. public static Person getPerson(String xml) {
52. Person person = null;
53. InputSource in = new InputSource(new StringReader(xml));
54. in.setEncoding("UTF-8");
55. SAXReader reader = new SAXReader();
56. Document document;
57. try {
58. document = reader.read(in);
59. Element root = document.getRootElement();
60. person = (Person) XmlUtil.fromXmlToBean(root, Person.class);
61.
62. } catch (Exception e) {
63. // TODO Auto-generated catch block
64. e.printStackTrace();
65. System.out.println("数据解析错误");
66.
67. }
68. return person;
69. }
70.
71. /**
72. * 把xml转化为person集合
73. *
74. * @param xml
75. * @return
76. */
77. public static List<Person> getPersonList(String xml) {
78.
79. Document doc = null;
80. List<Person> list = new ArrayList<Person>();
81. try {
82.
83. // 读取并解析XML文档
84.
85. // SAXReader就是一个管道,用一个流的方式,把xml文件读出来
86.
87. // SAXReader reader = new SAXReader(); //User.hbm.xml表示你要解析的xml文档
88.
89. // Document document = reader.read(new File("User.hbm.xml"));
90.
91. // 下面的是通过解析xml字符串的
92.
93. doc = DocumentHelper.parseText(xml); // 将字符串转为XML
94.
95. Element rootElt = doc.getRootElement(); // 获取根节点
96.
97. System.out.println("根节点:" + rootElt.getName()); // 拿到根节点的名称
98.
99. String returnCode = rootElt.elementTextTrim("desc");
100. if (!"0".equals(returnCode)) {
101. System.out.println("后台数据返回有问题");
102. return null;
103. }
104.
105. Iterator<Element> it = rootElt.elementIterator("content");// 获取根节点下所有content
106. while (it.hasNext()) {
107. Element elementGroupService = (Element) it.next();
108. Person baseBean = (Person) XmlUtil.fromXmlToBean(
109. elementGroupService, Person.class);
110. list.add(baseBean);
111. }
112.
113. } catch (Exception e) {
114. // TODO: handle exception
115. System.out.println("数据解析错误");
116. }
117.
118. return list;
119. }
120.
121. }
XmlUtil类:
[java] view plain copy
1. import java.lang.reflect.Field;
2. import java.util.Date;
3.
4. import org.dom4j.Element;
5.
6. public class XmlUtil
7. {
8. /**
9. * json 数据转换对象
10. *
11. * @param Element
12. * 要转换的Element数据
13. * @param pojo
14. * 要转换的目标对象类型
15. * @return 转换的目标对象
16. * @throws Exception
17. * 转换失败
18. */
19. @SuppressWarnings("rawtypes")
20. public static Object fromXmlToBean(Element rootElt, Class pojo) throws Exception
21. {
22. // 首先得到pojo所定义的字段
23. Field[] fields = pojo.getDeclaredFields();
24. // 根据传入的Class动态生成pojo对象
25. Object obj = pojo.newInstance();
26. for (Field field : fields)
27. {
28. // 设置字段可访问(必须,否则报错)
29. field.setAccessible(true);
30. // 得到字段的属性名
31. String name = field.getName();
32. // 这一段的作用是如果字段在Element中不存在会抛出异常,如果出异常,则跳过。
33. try
34. {
35. rootElt.elementTextTrim(name);
36. }
37. catch (Exception ex)
38. {
39. continue;
40. }
41. if (rootElt.elementTextTrim(name) != null && !"".equals(rootElt.elementTextTrim(name)))
42. {
43. // 根据字段的类型将值转化为相应的类型,并设置到生成的对象中。
44. if (field.getType().equals(Long.class) || field.getType().equals(long.class))
45. {
46. field.set(obj, Long.parseLong(rootElt.elementTextTrim(name)));
47. }
48. else if (field.getType().equals(String.class))
49. {
50. field.set(obj, rootElt.elementTextTrim(name));
51. }
52. else if (field.getType().equals(Double.class) || field.getType().equals(double.class))
53. {
54. field.set(obj, Double.parseDouble(rootElt.elementTextTrim(name)));
55. }
56. else if (field.getType().equals(Integer.class) || field.getType().equals(int.class))
57. {
58. field.set(obj, Integer.parseInt(rootElt.elementTextTrim(name)));
59. }
60. else if (field.getType().equals(java.util.Date.class))
61. {
62. field.set(obj, Date.parse(rootElt.elementTextTrim(name)));
63. }
64. else
65. {
66. continue;
67. }
68. }
69. }
70. return obj;
71. }
72. }
======================================================================
到这里希望对java新手有用