//////////只是更改了内存中dom树的信息,要永久生效必须序列化且修改时还要覆盖原文件///////////
/* 把dom对象序列化到磁盘文件 ----※技术入口:
要用到javax.xml.transform.Transformer类中的
transform(soure,result)方法 */
public class Dom {
//查: 把users.xml中的每一个user元素的信息输出
@Test
public void iteratorDemo() throws Exception{
//document
Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("./xml/users.xml");
//root
Element eUsers = (Element) dom.getFirstChild();
NodeList nodeList = eUsers.getElementsByTagName("user"); //所有<user>节点的集合
//遍历
for(int i=0; i<nodeList.getLength(); i++){
Element eUser = (Element) nodeList.item(i);
String name = eUser.getElementsByTagName("name").item(0).getTextContent();
String age = eUser.getElementsByTagName("age").item(0).getTextContent();
String id = eUser.getAttribute("id");
System.out.println("id:"+id+",name:"+name+",age:"+age);
System.out.println("----------");
}
}
//改: 把users.xml中的最后一个user元素的age设为20
//基本套路:根据要求把内存中的dom对象进行修改,然后利用Transform工具进行序列化
@Test
public void updateDemo() throws Exception{
//document
Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("./xml/users.xml");
//root
Element eUsers = (Element) dom.getFirstChild();
NodeList nodeList = eUsers.getElementsByTagName("user"); //所有<user>节点的集合
//获取最后一个<user>节点
Element eLastUser= (Element) nodeList.item( nodeList.getLength()-1 );
Node eAge = eLastUser.getElementsByTagName("age").item(0);
eAge.setTextContent("120");
//////////前面部分只是更改了内存中dom树的信息,要永久生效必须序列化且修改时还要覆盖原文件///////////
/* 把dom对象序列化到磁盘文件 ----※技术入口:
要用到javax.xml.transform.Transformer类中的
transform(soure,result)方法 */
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.transform(new DOMSource(dom), new StreamResult("./xml/users.xml"));//若文件已经存在则是修改,否则是"另存为"
}
//增: 向users.xml中的添加一个user元素
//基本套路:根据要求把内存中的dom对象进行修改,然后利用Transform工具进行序列化
@Test
public void addDemo() throws Exception{
Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("./xml/users.xml");
Element eUsers = (Element) dom.getFirstChild();
//创建一个新的<user>元素,并组装成一棵子树添加到<users>节点
Element eUser = dom.createElement("user"); //复杂节点需要添加子节点
eUser.setAttribute("id", "B002");//属性可以直接设置
//简单节点直接设置内容文本与属性
Element eName = dom.createElement("name");
eName.setTextContent("张三丰");
Element eAge = dom.createElement("age");
eAge.setTextContent("28");
//组装<user>子树: 让eUser添加两个孩子:eName,eAge
eUser.appendChild(eName);
eUser.appendChild(eAge);
//把子树eUser添加到dom树的文档根节点eUsers
eUsers.appendChild(eUser);
///////////不要忘记序列化//////////////
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.transform(new DOMSource(dom), new StreamResult("./xml/users.xml"));
}
//删: 把users.xml中的最后一个user元素删除
//基本套路:根据要求把内存中的dom对象进行修改,然后利用Transform工具进行序列化
@Test
public void delDemo() throws Exception{
Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("./xml/users.xml");
Element eUsers = (Element) dom.getFirstChild();
//找到最后一个<user>节点
//Node lastNode = eUsers.getLastChild();//有bug版本
NodeList nodeList = eUsers.getElementsByTagName("user"); //所有<user>节点的集合
Node lastNode = nodeList.item( nodeList.getLength()-1 );
//让lastNode执行:找父亲删自己
lastNode.getParentNode().removeChild(lastNode);
///////////不要忘记序列化//////////////
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.transform(new DOMSource(dom), new StreamResult("./xml/users.xml"));
}
}