对XML文件解析的方式主要有四种:DOM, SAX, DOM4J,JDOM.
DOM解析XML文件,将XML文件的全部内容以对象树方式存放在内存中,然后通过DOM API遍历XML树、得到需要的数据。方便简单,但是消耗的内存大。
下面是DOM解析的代码:
student.xml
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student studNo="1" name="张三">
<age>23</age>
<sex>男</sex>
</student>
<student studNo="2" name="李四">
<age>24</age>
<sex>男</sex>
<home>山西</home>
</student>
<student studNo="3" name="王五">
<age>20</age>
<sex>女</sex>
<single>单身</single>
</student>
</students>
student.java
public class Student {
private int studNo;
private String name;
private int age;
private String sex;
private String home;
private boolean isSingle;
public Student(int studNo, String name, int age, String sex, String home, boolean isSingle) {
super();
this.studNo = studNo;
this.name = name;
this.age = age;
this.sex = sex;
this.home = home;
this.isSingle = isSingle;
}
public Student() {
super();
}
/**
* toString();
*/
@Override
public String toString() {
return "Student [studNo=" + studNo + ", name=" + name + ", age=" + age + ", sex=" + sex + ", home=" + home
+ ", isSingle=" + isSingle + "]";
}
// getter and setter 方法
public int getStudNo() {
return studNo;
}
public void setStudNo(int studNo) {
this.studNo = studNo;
}
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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getHome() {
return home;
}
public void setHome(String home) {
this.home = home;
}
public boolean isSingle() {
return isSingle;
}
public void setSingle(boolean isSingle) {
this.isSingle = isSingle;
}
}
DOMHelper.java
public class DOMHelper {
/**
* XML文件解析,并将解析结果保存在List<Student>中。
*/
public List<Student> parserXML() {
List<Student> students = new ArrayList<Student>();
// 准备工作:
// 1.创建一个DocumentBuilderFactory对象;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
// 2.创建一个DocumentBuilderd对象;
DocumentBuilder db = dbf.newDocumentBuilder();
// 3.通过DocumentBuilder的parse方法得到XML的Document对象;
Document document = db.parse("data/student.xml");
// 解析XML;
// 通过标签获得XML中student标签的集合;
NodeList studList = document.getElementsByTagName("student");
// 遍历students,并将遍历结果,赋值给student对象;
Student student = null;
for(int i = 0; i < studList.getLength(); i++) {
// 遍历一次new一个student对象;
student = new Student();
// 得到第i+1个student.
Node stud = studList.item(i);
// 获得第i+1个student的属性值集合
NamedNodeMap attrs = stud.getAttributes();
// 遍历第i+1个student的属性值
for(int j = 0; j < attrs.getLength(); j++) {
// 若属性值为studNo,赋值给student对象的studNo
if(attrs.item(j).getNodeName().equals("studNo")) {
student.setStudNo(Integer.parseInt(attrs.item(j).getNodeValue()));
// 若属性为name,则赋值给student对象的name;
} else if(attrs.item(j).getNodeName().equals("name")) {
student.setName(attrs.item(j).getNodeValue());
}
}
// 判断是否有子节点
if(stud.hasChildNodes()) {
// 获得子节点的集合
NodeList childNodes = stud.getChildNodes();
// 遍历子节点
for(int j = 0; j < childNodes.getLength(); j++) {
if(childNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {
// 如果子节点的名字是age,则赋值给student对象的age属性
if(childNodes.item(j).getNodeName().equals("age")) {
//System.out.println(childNodes.item(j).getFirstChild().getNodeValue());
//System.out.println(childNodes.item(j).getTextContent());
student.setAge(Integer.parseInt(childNodes.item(j).getTextContent()));
// 如果子节点的名字是sex,则赋值给student对象的sex属性
} else if(childNodes.item(j).getNodeName().equals("sex")) {
student.setSex(childNodes.item(j).getTextContent());
// 如果子节点的名字是home,则赋值给student对象的home属性
} else if(childNodes.item(j).getNodeName().equals("home")) {
student.setHome(childNodes.item(j).getTextContent());
// 如果子节点的名字是 single,则赋值给student对象的single属性
} else if(childNodes.item(j).getNodeName().equals("single")) {
// single 属性是boolean
student.setSingle(childNodes.item(j).getTextContent().equals("单身"));
}
}
}
}
students.add(student);
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return students;
}
}
对于XML的创建,用DOM也比较简单,在DOMHelper中添加如下方法:
public void creatXML(List<Student> students) {
// 获取DocumentBuilderFactory对象。
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
// 获取DocumentBuilder对象
DocumentBuilder db = dbf.newDocumentBuilder();
// 创建XML树。
Document document = db.newDocument();
// standalone
document.setXmlStandalone(true);
// 创建一个students父节点。
Element studs = document.createElement("students");
// 对students进行遍历,加到document树中。
for(Student student : students) {
// 对每一个student创建一个节点
Element stud = document.createElement("student");
// 对student的节点设置属性
// 属性studNo
stud.setAttribute("studNo", String.valueOf(student.getStudNo()));
// 属性 name
stud.setAttribute("name", student.getName());
// 对student的节点设置子节点
// age子节点
Element age = document.createElement("age");
age.setTextContent(String.valueOf(student.getAge()));
stud.appendChild(age);
// sex子节点
Element sex = document.createElement("sex");
sex.setTextContent(student.getSex());
stud.appendChild(sex);
// home子节点
if(student.getHome() != null) {
Element home = document.createElement("home");
home.setTextContent(student.getHome());
stud.appendChild(home);
}
// single子节点
if(student.isSingle()) {
Element single = document.createElement("single");
single.setTextContent("单身");
stud.appendChild(single);
}
// stud子节点
studs.appendChild(stud);
}
// 将根节点放到DOM树中
document.appendChild(studs);
// TransformerFactoryg工厂对象
TransformerFactory tff = TransformerFactory.newInstance();
// 用工厂创建Transformer对象
Transformer tf = tff.newTransformer();
// 设置结构,使其换行
tf.setOutputProperty(OutputKeys.INDENT, "yes");
// 将树生成XML文件 用transform中的transform(Source xmlSource, Result outputTarget);
tf.transform(new DOMSource(document), new StreamResult(new File("data/students1.xml")));
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
现在开始测试DOMHelper中的这两个方法:
DOMTest.java
public class DOMTest {
public static void main(String[] args) {
DOMHelper dom = new DOMHelper();
List<Student> students = dom.parserXML();
dom.creatXML(students);
for(Student stud : students) {
System.out.println(stud);
}
}
}
以上就是通过DOM对XML的创建和解析得实验,在实际应用中应该根据实际情况进行处理。
以上是我学习时的实验,有什么不对的地方,敬请指正。本人将不胜感激!