package xmldom; import java.io.File; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerFactoryConfigurationError; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; /** * 对Student对象的CRUD(增、查、改、删)操作. * * @author Administrator * */ public class StudentDAOXml { /** * 得到文档对象 * @param doc * @return */ private Document getDoc() { try{ File f=new File("D:\\workspace\\base\\student.xml"); if (f.exists()) { DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); return builder.parse(f); }else{ Document doc=DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); doc.setXmlStandalone(false); doc.setXmlVersion("1.0"); //创建根元素 Element root=doc.createElement("students"); doc.appendChild(root); return doc; } }catch(Exception e){ e.printStackTrace(); } return null; } /** * 把DOM对象同步到文件中 */ private void dom2file(Document doc) throws TransformerFactoryConfigurationError { try { // 使用Transformer完成内存中的文档到文件的转换 TransformerFactory factory = TransformerFactory.newInstance(); Transformer transfer = factory.newTransformer(); //源 Source xmlSource=new DOMSource(doc); //目标 Result outputTarget=new StreamResult(new File("D:\\workspace\\base\\student.xml")); //完成源到目标的转换 transfer.transform(xmlSource, outputTarget); } catch (Exception e) { e.printStackTrace(); } } /** * 保存对象 * * 1,创建studentElement,设置属性 * 2,创建nameElement,设置内容 * 3,创建sexEl,设置内容 * 4,创建ageEl,设置内容 * 5,按顺序把el加到studentEl * 6,把studentEl加到根节点里面 * 7,同步 * */ public void save(Student s) { Document doc=this.getDoc(); if(doc!=null){ Element root=doc.getDocumentElement(); Element stuEl=doc.createElement("student"); stuEl.setAttribute("id", s.getId()); Element nameEl=doc.createElement("name"); nameEl.setTextContent(s.getName()); Element sexEl=doc.createElement("sex"); sexEl.setTextContent(s.getSex()); Element ageEl=doc.createElement("age"); ageEl.setTextContent(s.getAge().toString()); stuEl.appendChild(nameEl); stuEl.appendChild(sexEl); stuEl.appendChild(ageEl); root.appendChild(stuEl); } this.dom2file(doc); } /** * 修改对象 * 1,遍历得到给定id的studentEl * 2,得到nameEl,并修改里面文本值 * 3,得到ageEl,并修改里面的文本值 * * 4,同步 */ public void update(Student s) { Document doc=this.getDoc(); if(doc!=null){ Element root=doc.getDocumentElement(); NodeList nl=root.getElementsByTagName("student"); for(int i=0;i<nl.getLength();i++){ Element stuEl=(Element)nl.item(i); if(s.getId().equals(stuEl.getAttribute("id"))){ stuEl.getElementsByTagName("name").item(0).setTextContent(s.getName()); stuEl.getElementsByTagName("sex").item(0).setTextContent(s.getSex()); stuEl.getElementsByTagName("age").item(0).setTextContent(s.getAge().toString()); break; } } } this.dom2file(doc); } /** * 删除对象 * 1,找到要删除的那个element * 2,删除element * 3,同步到文件里面 */ public void delete(String id) { Document doc = this.getDoc(); if (doc != null) { Element root = doc.getDocumentElement(); NodeList nl = root.getElementsByTagName("student"); for (int i = 0; i < nl.getLength(); i++) { Element stuEl=(Element)nl.item(i); if(id.equals(stuEl.getAttribute("id"))){ //删除这个节点 stuEl.getParentNode().removeChild(stuEl); break; } } dom2file(doc); } } /** * 根据id查询一个对象 */ public Student get(String id) { Student s=null; Document doc=null; doc = getDoc(); if(doc!=null){ Element root=doc.getDocumentElement(); NodeList nl=root.getElementsByTagName("student"); for(int i=0;i<nl.getLength();i++){ Element stuEl=(Element)nl.item(i); if(id.equals(stuEl.getAttribute("id"))){ s=new Student(); s.setId(stuEl.getAttribute("id")); s.setName(stuEl.getElementsByTagName("name").item(0).getTextContent()); s.setSex(stuEl.getElementsByTagName("sex").item(0).getTextContent()); s.setAge(Integer.parseInt(stuEl.getElementsByTagName("age").item(0).getTextContent())); break; } } } return s; } /** * 查询所有的对象 * 思路: * 把XML里面的student元素一个一个解析为Student对象实例 * 1,得到文档对象 ** *1,创建工厂 ** *2, 得到创建器 ** *3,使用创建器解析XML得到document文档对象 * 2,遍历student元素 ** *1,得到根节点 ** *2,得到所有的Student元素 ** *3,把每个student元素转成Student实例 ** *1,创建一个student实例 ** *2,得到ID元素设置到student里面 ** *3,得到name子元素,把那么子元素里面的子节点的内容设置到name属性 ** *4,得到age子元素,把那么子元素里面的子节点的内容设置到age属性 ** *5,装到结果集里面 * 4,返回结果集 */ public List<Student> list() { List<Student> ss=new ArrayList<Student>(); Document doc=null; doc = getDoc(); if(doc!=null){ Element root=doc.getDocumentElement(); //根据元素的名称得到所有符合这个元素名称的元素节点 NodeList nl=root.getElementsByTagName("student"); for(int i=0;i<nl.getLength();i++){ Element stuEl=(Element)nl.item(i); Student student=new Student(); student.setId(stuEl.getAttribute("id")); // stuEl.getElementsByTagName("name").item(0).getChildNodes().item(0).getTextContent(); student.setName(stuEl.getElementsByTagName("name").item(0).getTextContent()); student.setSex(stuEl.getElementsByTagName("sex").item(0).getTextContent()); student.setAge(Integer.parseInt(stuEl.getElementsByTagName("age").item(0).getTextContent())); ss.add(student); } } return ss; } } public class Student { private String id; private String name; private String sex; private Integer age; public String getId() { return id; } public void setId(String 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 Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + "]"; } }