一次将所有数据全部加载到内存中。
对xml文档中的每一个节点都当成一个Node对像处理。包括元素、文本、属性。
org.w3c.dom包中的Document,Element,Node。
非常方便进行修改。
已经集成在了JDK中,是Sun对xml操作的标准。
缺点是当文档数据量很大时,对内存有占用很大。
由于DOM解析,一次性的将所有元素(包含属性和文本) 全部加载到内存中,所以不适用于解析大量的数据
javax.xml.parse – 关键类DocumentBuilder,文档解析对像。
org.w3c.dom – 关键类Document代表内存中的文档对像模型。
java.xml – 关键类Transformer,用于将内存中的文档保存到文件中。
//第一步,通过DocumentBuilderFactory类中的工厂方法等到一个dbFactory对象
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
//第二步,通过dbFactory对象的newDocumentBuilder方法得到一个DocumentBuilder对象db
DocumentBuilder db = dbFactory.newDocumentBuilder();
//第三步,利用db对象的parse方法得到一个Document对象dom
Document dom = db.parse(new File("./xml4/users.xml"));
//然后进项dom操作
//第一步,用TransformerFactory的工厂方法得到一个tfFactory对象
TransformerFactory tfFactory = TransformerFactory.newInstance();
//第二步,用tfFactory对象的newTransformer得到一个Transformer对象tf
Transformer tf = tfFactory.newTransformer();
//第三步,用tf对象的transform方法保存
tf.transform(new DOMSource(dom), new StreamResult(new File("./xml4/users.xml")));
package cn.hncu;
import java.io.File;
import java.io.IOException;
import javax.mail.internet.NewsAddress;
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.DOMResult;
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;
public class DomDemo1 {
@Test//需求:将第一个user的name拿出来
public void getName() throws ParserConfigurationException, SAXException, IOException{
//第一步,通过DocumentBuilderFactory类中的工厂方法等到一个dbFactory对象
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
//第二步,通过dbFactory对象的newDocumentBuilder方法得到一个DocumentBuilder对象db
DocumentBuilder db = dbFactory.newDocumentBuilder();
//第三步,利用db对象的parse方法得到一个Document对象dom
Document dom = db.parse(new File("./xml4/users.xml"));
//然后进项dom操作
Element root = (Element) dom.getFirstChild();
//System.out.println(root.getNodeName());//users
NodeList list = root.getElementsByTagName("user");
Element eUser1 = (Element) list.item(0);
String name = eUser1.getElementsByTagName("name").item(0).getTextContent();
// System.out.println("name:"+name);//name:小明
}
//用java对dom进行CRUD--增、读、改、删操作
//增
@Test
public void create() throws ParserConfigurationException, SAXException, IOException, TransformerException{
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbFactory.newDocumentBuilder();
Document dom = db.parse(new File("./xml4/users.xml"));
Element root = (Element) dom.getFirstChild();
Element eUser = dom.createElement("user");
Element eName = dom.createElement("name");
eName.setTextContent("菲菲");
Element eAge = dom.createElement("age");
eAge.setTextContent(""+21);
eUser.appendChild(eName);
eUser.appendChild(eAge);
root.appendChild(eUser);
//因为dom是将一棵树整个拷进内存操作 所以我们上面操作的只是内存中的dom并没有存到硬盘中去。
//下面就是将内存中的dom树存入硬盘中
//第一步,用TransformerFactory的工厂方法得到一个tfFactory对象
TransformerFactory tfFactory = TransformerFactory.newInstance();
//第二步,用tfFactory对象的newTransformer得到一个Transformer对象tf
Transformer tf = tfFactory.newTransformer();
//第三步,用tf对象的transform方法保存
tf.transform(new DOMSource(dom), new StreamResult(new File("./xml4/users.xml")));
}
//查
@Test
public void query() throws Exception{
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbFactory.newDocumentBuilder();
Document dom = db.parse(new File("./xml4/users.xml"));
Element root = (Element) dom.getFirstChild();
NodeList users= root.getElementsByTagName("user");
for(int i=0;i
Element e = (Element) root.getElementsByTagName("user").item(i);
String name = e.getElementsByTagName("name").item(0).getTextContent();
String age = e.getElementsByTagName("age").item(0).getTextContent();
System.out.println("user:"+name+",age:"+age);
System.out.println("======================");
}
}
//改
@Test
public void update() throws Exception{
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbFactory.newDocumentBuilder();
Document dom = db.parse(new File("./xml4/users.xml"));
Element root = (Element) dom.getFirstChild();
NodeList userList= root.getElementsByTagName("user");
Element userUpdate = (Element) userList.item(0);
Element eName = (Element) userUpdate.getElementsByTagName("name").item(0);
eName.setTextContent("王子是个老不死");
//从内存写入硬盘$$$$记住
TransformerFactory tfFactory = TransformerFactory.newInstance();
Transformer tf = tfFactory.newTransformer();
tf.transform(new DOMSource(dom), new StreamResult("./xml4/users.xml"));
}
//删除
@Test
public void delete() throws Exception{
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbFactory.newDocumentBuilder();
Document dom = db.parse(new File("./xml4/users.xml"));
Element root = (Element) dom.getFirstChild();
NodeList userList= root.getElementsByTagName("user");
Element userDelete = (Element) userList.item(userList.getLength()-1);
root.removeChild(userDelete);
//保存
TransformerFactory tfFactory = TransformerFactory.newInstance();
Transformer tf = tfFactory.newTransformer();
tf.transform(new DOMSource(dom), new StreamResult("./xml4/users.xml"));
}
}
<users>
<user id="a001">
<name>王子是个老不死name>
<age>23age>
user>
<user id="p005">
<name>嫁衣name>
<age>18age>
user>
users>