这是对xml文档解析的第二个课时,通过几天的熟悉和练习。已经可以基本掌握利用java对xml文档的增、删、改、查。
先贴上xml文档代码
<?xml version="1.0" encoding="UTF-8" standalone="no"?><users>
<user id="A001">
<name>Jack</name>
<age>22</age>
</user>
<user id="A002">
<name>张三</name>
<age>24</age>
</user>
<user id="B001">
<name>小李</name>
<age>20</age>
</user>
<user id="B002">
<name>小张</name>
<age>28</age>
</user>
<user id="C001">
<name>刘备</name>
<age>25</age>
</user>
</users>
查:
要求:将xml文档中的部分内容按照如下格式输出
id:A001, name:Jack, age:22
----------------------
id:A002, name:张三, age:24
----------------------
id:B001, name:小李, age:20
----------------------
id:B002, name:小张, age:28
----------------------
id:C001, name:刘备, age:35
----------------------
第一步:拿到Document 对象 因为后面都要用到,我抽群成了方法:
// 一个获得xml文档对象的方法
private Document getDom() throws ParserConfigurationException,
SAXException, IOException {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document dom = db.parse("./xml/users.xml");
return dom;
}
获取xml内容 的方法
// 查--遍历
@Test
public void getinfo(){
try {
// 拿到dom
Document dom = getDom();
// 拿第一个子元素,根
Element root = (Element) dom.getFirstChild();
// 再来找 所有的 user
NodeList usersList = root.getElementsByTagName("user");
for(int i=0;i<usersList.getLength();i++){
//拿到里面的每一个user元素
Element e = (Element) usersList.item(i);
// 拿user元素里面的 id 属性
String id = e.getAttribute("id");
// 拿 name 的 文本内容
String name = e.getElementsByTagName("name").item(0).getTextContent();
// 拿 age 的 文本内容
String age = e.getElementsByTagName("age").item(0).getTextContent();
String str = "id:"+id+",name:"+name+",age:"+age;
System.out.println(str);
System.out.println("-------------------");
}
} catch (Exception e) {
e.printStackTrace();
}
}
结果如下:
改
//改 ---需求:把最后一个user的年龄改为 age+10
@Test
public void changeAge (){
try {
// 拿到 dom
/* DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document dom = db.parse(new File("./xml/users.xml"));*/
Document dom = getDom();
// 拿到最后一个user的age,并且年龄加10
Element root = (Element) dom.getFirstChild();
NodeList usersList = root.getElementsByTagName("user");
Element lastuser = (Element) usersList.item(usersList.getLength()-1);
Element age = (Element) lastuser.getElementsByTagName("age").item(0);
age.setTextContent( Integer.parseInt(age.getTextContent())+10+"");
//保存,把内存中操作的结果保存到 文档(硬盘)中
TransformerFactory tfF = TransformerFactory.newInstance();
Transformer tf = tfF.newTransformer();
tf.transform(new DOMSource(dom), new StreamResult("./xml/users.xml"));
} catch (Exception e) {
e.printStackTrace();
}
}
当改成功后MyEclipse会提示是否要重新加载信息
user.xml修改后代码如下
<?xml version="1.0" encoding="UTF-8" standalone="no"?><users>
<user id="A001">
<name>Jack</name>
<age>22</age>
</user>
<user id="A002">
<name>张三</name>
<age>24</age>
</user>
<user id="B001">
<name>小李</name>
<age>20</age>
</user>
<user id="B002">
<name>小张</name>
<age>28</age>
</user>
<user id="C001">
<name>刘备</name>
<age>35</age>
</user>
</users>
保持到xml文档的方法后面会多次用到故,也抽取出来
private void saveDom(Document dom)
throws TransformerFactoryConfigurationError,
TransformerConfigurationException, TransformerException {
//保存,把内存中操作的结果保存到 文档(硬盘)中
TransformerFactory tfF = TransformerFactory.newInstance();
Transformer tf = tfF.newTransformer();
tf.transform(new DOMSource(dom), new StreamResult("./xml/users.xml"));
}
剩下的增加。删除也类似,就是调用的方法不用,我把争端代码贴上。
package cn.hncu.jaxp.dom;
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.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
* XML学习---利用Java对XML文档的增、删、改、查
* @author<a href="mailto:953801304@qq.com">胡龙华</a>
* @version 2017-5-27 下午1:26:44
* @fileName DomDemo2.java
*/
public class DomDemo2 {
// 用Java对xml文档进行CRUD---增删改查
// 查--遍历
@Test
public void getinfo(){
try {
// 拿到dom
Document dom = getDom();
// 拿第一个子元素,根
Element root = (Element) dom.getFirstChild();
// 再来找 所有的 user
NodeList usersList = root.getElementsByTagName("user");
for(int i=0;i<usersList.getLength();i++){
//拿到里面的每一个user元素
Element e = (Element) usersList.item(i);
// 拿user元素里面的 id 属性
String id = e.getAttribute("id");
// 拿 name 的 文本内容
String name = e.getElementsByTagName("name").item(0).getTextContent();
// 拿 age 的 文本内容
String age = e.getElementsByTagName("age").item(0).getTextContent();
String str = "id:"+id+",name:"+name+",age:"+age;
System.out.println(str);
System.out.println("-------------------");
}
} catch (Exception e) {
e.printStackTrace();
}
}
private Document getDom() throws ParserConfigurationException,
SAXException, IOException {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document dom = db.parse("./xml/users.xml");
return dom;
}
//改 ---需求:把最后一个user的年龄改为 age+10
@Test
public void changeAge (){
try {
// 拿到 dom
/* DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document dom = db.parse(new File("./xml/users.xml"));*/
Document dom = getDom();
// 拿到最后一个user的age,并且年龄加10
Element root = (Element) dom.getFirstChild();
NodeList usersList = root.getElementsByTagName("user");
Element lastuser = (Element) usersList.item(usersList.getLength()-1);
Element age = (Element) lastuser.getElementsByTagName("age").item(0);
age.setTextContent( Integer.parseInt(age.getTextContent())+10+"");
saveDom(dom);
} catch (Exception e) {
e.printStackTrace();
}
}
//增 ---需求: 给文档添加一个新的<user>节点
@Test
public void addElement(){
try {
Document dom = getDom();
//先建立好需要添加的user字樹
Element addUser = dom.createElement("user"); // <user></user>
// 添加user的屬性
addUser.setAttribute("id", "DG001"); // <user id="DG001"></user>
// 创建user下的name 和 age 节点
Element name = dom.createElement("name");
Element age = dom.createElement("age");
// 对name、age进行赋值
name.setTextContent("达哥");
age.setTextContent("20");
// 把 name、age节点加到user节点上
addUser.appendChild(name);
addUser.appendChild(age);
// 把user 加到dom树的根上去
dom.getFirstChild().appendChild(addUser);
saveDom(dom);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void saveDom(Document dom)
throws TransformerFactoryConfigurationError,
TransformerConfigurationException, TransformerException {
//保存,把内存中操作的结果保存到 文档(硬盘)中
TransformerFactory tfF = TransformerFactory.newInstance();
Transformer tf = tfF.newTransformer();
tf.transform(new DOMSource(dom), new StreamResult("./xml/users.xml"));
}
//删除 ---需求: 把最后的<user>节点删除了
@Test
public void removeUser(){
try {
// 拿到dom 和 保存。。。 调用方法把 我写了好多遍了
Document dom = getDom();
// 拿到最后一个 user节点
NodeList usersList = dom.getElementsByTagName("user");
Element lastUser = (Element) usersList.item(usersList.getLength()-1);
// 调用 父节点 删除自己
lastUser.getParentNode().removeChild(lastUser);
// baoc
saveDom(dom);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}