
<?xml version="1.0" encoding="utf-8" standalone="no"?><school>
<student address="江苏省宿迁市" grade="八年级八班" name="郭胜">
<chinese>99</chinese>
<math>99</math>
<english>99</english>
</student>
</school>
package jaxp;
import java.io.File;
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.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
/**
* xml解析工具类
* @author 郭胜
*
*/
public class JaxpUtil {
/*
* W3C组织对DOM是这样定义的:
* 整个文档是一个文档节点(Document)
*
* XML中的每个标签都是元素节点(Element Node)
*
* XML中的每个文本都是文本节点(Text Node)
*
* XML中的标签属性都是属性节点(Attr Node)
*
* XML中的注释被称为注释节点(Comment Node)
* 文本总是存储在文本节点中,而不是存储在元素节点中的,在 DOM 处理中一个普遍的错误是,认为元素节点包含文本。
*
* 需要注意的是:由于解析器会将XML文档中的所有节点都加载到内存之中,所以可以很方便的完成CRUD操作,但是此方法也过于暴力,当XML文档内容过大时,可能会造成内存溢出的情况
* crud是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。
*/
public static Document getDocument(String filePath) throws ParserConfigurationException, SAXException, IOException{
//获取 DocumentBuilderFactory 的新实例。
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//使用当前配置的参数创建一个新的 DocumentBuilder 实例。
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse( new File(filePath));
return doc;
}
/**
* 将document写入xml文件中
* 郭胜
* @return
* @throws TransformerException
*/
public static boolean writeDocumentToXml(Document doc){
boolean flag = false;
TransformerFactory tfactory = TransformerFactory.newInstance();
try {
Transformer tf = tfactory.newTransformer();
tf.transform(new DOMSource(doc), new StreamResult(
new File("jaxp/student.xml")));
flag = true;
} catch (TransformerException e) {
e.printStackTrace();
}
return flag;
}
}
package jaxp;
/**
* xml文件解析
* @author 郭胜
*
*/
public interface JaxpDao {
/**
* 插入学生
* @param stu
* @return true 成功 false 失败
*/
public boolean insertStudent(Student stu);
/**
* 根据学生姓名删除学生
* @param name
* @return true 成功 false 失败
*/
public boolean delStudent(String name);
/**
* 修改学生信息
* @param stu
* @return true 成功 false 失败
*/
public boolean updateStudent(Student stu);
/**
* 查询学生
* @param stu
* @return Student查询成功 null查询失败
*/
public Student searchStudent(Student stu);
}
package jaxp;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class JaxpDaoImpl implements JaxpDao {
/*
* <student name="郭胜" address="江苏省宿迁市" grade="三年级二班" >
<chinese>100</chinese>
<math>100</math>
<english>100</english>
</student>(non-Javadoc)
* @see jaxp.JaxpDao#insertStudent(jaxp.Student)
*/
public boolean insertStudent(Student stu) {
boolean flag = false;
try {
Document doc = JaxpUtil.getDocument("jaxp/student.xml");
Element stuElement = doc.createElement("student");
stuElement.setAttribute("name", stu.getName());
stuElement.setAttribute("address", stu.getAddress());
stuElement.setAttribute("grade", stu.getGrade());
Element chiElement = doc.createElement("chinese");
chiElement.setTextContent(stu.getChinese().toString());
stuElement.appendChild(chiElement);
Element mathElement = doc.createElement("math");
mathElement.setTextContent(stu.getMath().toString());
stuElement.appendChild(mathElement);
Element englishElement = doc.createElement("english");
englishElement.setTextContent(stu.getEnglish().toString());
stuElement.appendChild(englishElement);
Element rootElement = (Element)doc.getElementsByTagName("school").item(0);
rootElement.appendChild(stuElement);
flag = JaxpUtil.writeDocumentToXml(doc);
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
/*
* <student name="郭胜" address="江苏省宿迁市" grade="三年级二班" >
<chinese>100</chinese>
<math>100</math>
<english>100</english>
</student>(non-Javadoc)
* @see jaxp.JaxpDao#insertStudent(jaxp.Student)
*/
public boolean delStudent(String name) {
boolean flag = false;
try {
Document doc = JaxpUtil.getDocument("jaxp/student.xml");
NodeList list = doc.getElementsByTagName("student");
Element rootElement = (Element)doc.getElementsByTagName("school").item(0);
for (int i=0;i<list.getLength();i++) {
Node node = list.item(i);
if(node.getNodeType() == Node.ELEMENT_NODE){
Element element = (Element)node;
if(element.getAttribute("name").equals(name)){
rootElement.removeChild(element);
break;
}
}
}
flag = JaxpUtil.writeDocumentToXml(doc);
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
}
return flag;
}
/*
* <student name="郭胜" address="江苏省宿迁市" grade="三年级二班" >
<chinese>100</chinese>
<math>100</math>
<english>100</english>
</student>(non-Javadoc)
* @see jaxp.JaxpDao#insertStudent(jaxp.Student)
* 修改一个属性,grade属性,和成绩
*/
public boolean updateStudent(Student stu) {
boolean flag = false;
try {
Document doc = JaxpUtil.getDocument("jaxp/student.xml");
NodeList list = doc.getElementsByTagName("student");
for(int i= 0;i<list.getLength();i++){
if(list.item(i).getNodeType() == Node.ELEMENT_NODE){
Element element = (Element)list.item(i);
if(element.getAttribute("name").equals(stu.getName())){
element.setAttribute("grade", "八年级八班");
NodeList childList = element.getChildNodes();
for(int j=0;j<childList.getLength();j++){
Node cnode = childList.item(j);
if(cnode.getNodeType() == Node.ELEMENT_NODE){
Element cElement = (Element)cnode;
if(cElement.getTagName().equals("chinese")){
cElement.setTextContent(stu.getChinese().toString());
}
if(cElement.getTagName().equals("math")){
cElement.setTextContent(stu.getMath().toString());
}
if(cElement.getTagName().equals("english")){
cElement.setTextContent(stu.getEnglish().toString());
}
}
}
break;
}
}
}
flag = JaxpUtil.writeDocumentToXml(doc);
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
}
return flag;
}
/*
* <student name="郭胜" address="江苏省宿迁市" grade="三年级二班" >
<chinese>100</chinese>
<math>100</math>
<english>100</english>
</student>(non-Javadoc)
* @see jaxp.JaxpDao#insertStudent(jaxp.Student)
* 根据学生姓名,搜寻学生信息
*/
public Student searchStudent(Student stu) {
try {
Document doc = JaxpUtil.getDocument("jaxp/student.xml");
NodeList list = doc.getElementsByTagName("student");
for(int i=0;i<list.getLength();i++){
Node node = list.item(i);
if(node.getNodeType() == Node.ELEMENT_NODE){
Element stuElement = (Element)node;
if(stuElement.getAttribute("name").equals(stu.getName())){
stu.setAddress(stuElement.getAttribute("address"));
stu.setGrade(stuElement.getAttribute("grade"));
NodeList cNodeList = stuElement.getChildNodes();
for(int j=0;j<cNodeList.getLength();j++){
Node cNode = cNodeList.item(j);
if(cNode.getNodeType() == Node.ELEMENT_NODE){
Element cElement = (Element)cNode;
if(cElement.getTagName().equals("chinese")){
stu.setChinese(Integer.parseInt(cElement.getTextContent()));
}
if(cElement.getTagName().equals("math")){
stu.setMath(Integer.parseInt(cElement.getTextContent()));
}
if(cElement.getTagName().equals("english")){
stu.setEnglish(Integer.parseInt(cElement.getTextContent()));
}
}
}
break;
}
}
}
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
}
return stu;
}
}
package jaxp;
/**
* jaxp测试
* @author 郭胜
*
*/
public class MainTest {
public static void main(String[] args){
Student stu = new Student();
stu.setAddress("江苏省南京市");
stu.setChinese(99);
stu.setEnglish(99);
stu.setMath(99);
stu.setName("郭胜");
stu.setGrade("六年级六班");
JaxpDao jd = new JaxpDaoImpl();
/*boolean flag = jd.insertStudent(stu);
MainTest.showFlag(flag);*/
boolean flag;
/*flag = jd.delStudent("黄圣依");
MainTest.showFlag(flag);*/
flag = jd.updateStudent(stu);
MainTest.showFlag(flag);
/*stu.setName("郭胜");
stu = jd.searchStudent(stu);
stu.toString();*/
}
public static void showFlag(boolean flag){
if(flag){
System.out.println("成功");
}else{
System.out.println("失败");
}
}
}