一、使用DOM解析XML主要使用的对象
1、 Document 代表整个XML文档
getElementsByTagName(String name) 通过标签获得节点列表
getDocumentElement( ) 获得根节点
createElement() 创建元素
createAttribute() 创建属性
createTextNode() 创建文本节点值
removeChild() 删除节点
2、 NodeList 指包含了一个或者多个节点(Node)的列表
item(int index) 遍历每一项
3、 Element 代表XML文档中的标签
getAttribute(String attributename) 获得属性
setAttribute(String attributename) 设置属性
4、Node是DOM 结构中最基本的对象,代表了文档树中的一个抽象节点
getChildNodes( ) 获得当前节点的孩子
getNodeName( ) 获得节点的名称
getNodeValue( ) 获得节点的文本值
getFirstChild() 获得节点的第一个孩子
二、使用DOM解析XML的具体操作(CRUD)
stu.xml文件
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<students>
<student id="java1401">
<name>zal</name>
<age>22</age>
</student>
<student id="java1402">
<name>吴晟</name>
<age>22</age>
</student>
<student id="java1403">
<name>沈彦</name>
<age>21</age>
</student>
<student id="QQ1334">
<name>mike</name>
<age>12</age>
</student>
</students>
1)实体类省略
2)业务类
package com.hlx.dom;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;
public class StudentBiz {
/**
* 1.获得文档对象
*
* @param name
* xml文件
* @return
*/
public Document getDocument(String name) {
// 1.创建解析器工厂对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2.由解析器工厂对象创建解析器对象
try {
DocumentBuilder db = factory.newDocumentBuilder();
// 3.由解析器对象对指定XML文件进行解析
Document document = db.parse(name);
return document;
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 2.解析文档 XML
*
* @param name
*/
public void parseXMl(String name) {
// 1.获得文档对象
Document document = getDocument(name);
// 通过student的标签获得具体的孩子
NodeList list = document.getElementsByTagName("student");
// 遍历数据
System.out.println("学号\t\t姓名 \t年龄");
for (int i = 0; i < list.getLength(); i++) {
// buffer对象
StringBuffer buffer = new StringBuffer();
// 获得元素
Element element = (Element) list.item(i);
// 追加数据 --属性
buffer.append(element.getAttribute("id") + "\t");
// 追加数据 --元素 getFirstChild()
buffer.append(document.getElementsByTagName("name").item(i)
.getFirstChild().getNodeValue()
+ "\t");
buffer.append(document.getElementsByTagName("age").item(i)
.getFirstChild().getNodeValue());
// 输出信息
System.out.println(buffer.toString());
}
}
public void add(String name, Student stu) {
// 1.获得文档对象
Document document = getDocument(name);
// 2.创建student,name,age元素
// <student></student>
Element studentEle = document.createElement("student");
// <name></name>
Element nameEle = document.createElement("name");
// <age></age>
Element ageEle = document.createElement("age");
// 3.创建属性 id
Attr idAttr = document.createAttribute("id");
// 给id赋值
idAttr.setNodeValue(stu.getId());
// 4.文本值 沈彦
Text txtName = document.createTextNode(stu.getName());
// 21
Text txtAge = document.createTextNode(stu.getAge() + "");
// 5.将文本值追加到具体的元素上name,age
nameEle.appendChild(txtName);
ageEle.appendChild(txtAge);
// 6.将name,age追加到student
studentEle.appendChild(nameEle);
studentEle.appendChild(ageEle);
// 7.将属性追加到student
studentEle.setAttributeNode(idAttr);
// 8.将student追加到根节点下students
Element root = document.getDocumentElement();
root.appendChild(studentEle);
// 9.写入xml文件
saveToXml(name, document);
System.out.println("添加成功!");
}
/**
* 写入XML文件中
*
* @param name
* @param document
*/
public void saveToXml(String name, Document document) {
// 1.首先创建转化工厂
TransformerFactory factory = TransformerFactory.newInstance();
// 2.创建Transformer,它能够将源树转换为结果树
try {
Transformer former = factory.newTransformer();
// 设置输出样式-->不在同一行
former.setOutputProperty("indent", "yes");
// 3.文档xml
DOMSource source = new DOMSource(document);
// 4.结果 : name=stu.xml
StreamResult result = new StreamResult(new FileOutputStream(
new File(name)));
// 5.保存
// 执行将XML Source转换为 Result
former.transform(source, result);
} catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 删除XML文件中的某一个数据
*
* @param string
* @param student
*/
public void del(String name, Student student) {
// 1.获得文档对象
Document document = getDocument(name);
// 2.获得student节点
NodeList list = document.getElementsByTagName("student");
// 3.遍历
for (int i = 0; i < list.getLength(); i++) {
// 获得每一个元素student
Element element = (Element) list.item(i);
// 判断 属性
if (element.getAttribute("id").equals(student.getId())) {
// 找到就删除
document.getDocumentElement().removeChild(element);
// 退出循环
break;
}
}
// 9.写入xml文件
saveToXml(name, document);
System.out.println("删除成功!");
}
/**
* 修改数据
*
* @param string
* @param stu1
*/
public void update(String name, Student student) {
// 1.获得文档对象
Document document = getDocument(name);
// 2.获得student节点
NodeList list = document.getElementsByTagName("student");
// 3.遍历
for (int i = 0; i < list.getLength(); i++) {
// 获得每一个元素student
Element element = (Element) list.item(i);
// 判断 属性
if (element.getAttribute("id").equals(student.getId())) {
// 找到就修改 name,age
element.getElementsByTagName("name").item(0).getFirstChild().setNodeValue(student.getName());
element.getElementsByTagName("age").item(0).getFirstChild().setNodeValue(student.getAge()+"");
// 退出循环
break;
}
}
// 9.写入xml文件
saveToXml(name, document);
System.out.println("修改成功!");
}
}
3)测试类省略