随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)、QQ技术交流群(183198395)。
XML示例:
<?xml version="1.0" encoding='utf-8'?> <!-- 声明-->
<studentList> <!-- 根元素,一个XML文件有且只有一个根元素,所有的元素和子元素都必须在根元素中定义-->
<student id="1">
<name>张三</name>
<sex>男</sex>
<birthday>1986-12-21</birthday>
</student>
<student id="2">
<name>李四</name>
<sex>女</sex>
<birthday>1990-09-10</birthday>
</student>
<student id="3">
<name>王五</name>
<sex>男</sex>
<birthday>1989-03-20</birthday>
</student>
<student id="4">
<name>赵六</name>
<sex>男</sex>
<birthday>1985-05-23</birthday>
</student>
</studentList>
使用DOM4J解析XML:
package com.lovo.test;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.lovo.bean.Student;
public class DomTest {
/**
* 解析XML,将XML的数据封装成List集合
*
* @return Student对象的集合
*/
public List<Student> getList() {
List<Student> list = new ArrayList<Student>();
SAXReader sax = new SAXReader();// 产生sax解析对象
try {
Document doc = sax.read("student.xml"); // 读取文档,将文档内容封装成Document对象
// 读取Student根元素下的student子元素,返回所有student标记的元素集合,一个Element封装一个student标记
List<Element> eleList = doc.selectNodes("/studentList/student");
for (Element e : eleList) {
Student s = new Student();
String idStr = e.attributeValue("id");// 得到每个student标记中的id属性的值
String name = e.elementText("name");// 得到student子标签name中间的内容
String sex = e.elementText("sex");// 得到student子标签sex中间的内容
String birthday = e.elementText("birthday");// 得到student子标签birthday中间的内容
// 将XML中student标记得到的数据封装成Student对象
s.setId(Integer.parseInt(idStr));
s.setName(name);
s.setSex(sex);
s.setBirthday(Date.valueOf(birthday));
list.add(s);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
public static void main(String[] args) {
DomTest d = new DomTest();
List<Student> list = d.getList();
System.out.println(list);
}
}
Student实体类:
package com.lovo.bean;
import java.sql.Date;
public class Student implements java.io.Serializable{
private int id;
private String name;
private String sex;
private Date birthday;
public Student() {
super();
}
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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String toString(){
return this.id+" "+this.name+" "+this.sex+" "+this.birthday;
}
}
DTD的书写:
<?xml version="1.0" encoding="GB2312" ?>
<!DOCTYPE 家庭 [ <!-- 定义XML文件的根元素为家庭-->
<!ELEMENT 家庭 (人+,家电*)> <!--定义元素家庭的子元素有人和家电,人至少有一个,没有上限;家电可以没有,也可以有多个 -->
<! ELEMENT 人 (#PCDATA)> <!-- 表示人标记中的内容为文本 -->
<!ELEMENT 家电 EMPTY> <!-- 表示空标记,标记之间没有内容 -->
<!ATTLIST 人
名字 CDATA #REQUIRED
性别 (男|女) #REQUIRED
年龄 CDATA #REQUIRED
爱好 CDATA #IMPLIED
> <!-- 表示定义人标记的属性,CDATA表示该属性的内容为文本,在书写标记时, #REQUIRED表示该属性必须存在 ,#IMPLIED表示该属性可有可无,(男|女)表示该属性的取值为男或女 -->
<!ATTLIST 家电
名称 CDATA #REQUIRED
数量 CDATA #REQUIRED
说明 CDATA #IMPLIED
>
]>
<家庭> <!-- 符合上面DTD规范的XML示例 -->
<人 名字="郭大路" 性别="男" 年龄="25">ffff</人>
<人 名字="李寻欢" 性别="男" 年龄="38" 爱好="看书"/>
<家电 名称="彩电" 数量="3"/>
</家庭>