关键词-解释:
DOM-Document Object Model-文档对像模型。是w3c组织处理xml的一种方式。
特点:
一次将所有数据全部加载到内存中。
对xml文档中的每一个节点都当成一个Node对像处理。包括元素、文本、属性。
org.w3c.dom包中的Document,Element,Node。
非常方便进行修改。
已经集成在了JDK中,是Sun对xml操作的标准。
缺点是当文档数据量很大时,对内存有占用很大。
Sax – Simple Api for XML 。
在读取数据时分析数据,通过事件监听器来完成。
速度快但只适合读取数据,仅向前读取不可后退。
解析XML的方式分为以下几种-图解:
解析XML的方式分为以下几种:
JAXP(JavaApi for Xml Programming) – sun公司的一套操作XML的API
DOM解析-一次性的将数据全部装入内存。
SAX解析-边读取边解析。
Dom4j(Document For Java)-第三方开源,是从jdom分裂出来的解析技术。目前jdom已经完全被dom4j替代。
jDom – Dom4j的前身。
Dom4j在性能和速度上都比sun公司的要快,而且支持Xpath快速查找,目前像Spring,Hibernate这些大型的框架,都是用的dom4j.
StAX – JDK1.6新特性,做为JAXP的新成员已经集成在了JDK6当中。
JAXP-DOM解析:
DOM解析一次将所有的元素全部加载到内存中。
由于DOM解析,一次性的将所有元素(包含属性和文本) 全部加载到内存中,所以不适用于解析大量的数据。
包:
javax.xml.parse – 关键类DocumentBuilder,文档解析对像。
org.w3c.dom – 关键类Document代表内存中的文档对像模型。
java.xml – 关键类Transformer,用于将内存中的文档保存到文件中。
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
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.Node;
import org.w3c.dom.NodeList;
public class domDemo1{
//查--遍历
@Test
public void test1() throws Exception{
//DocumentBuilder db=new D...不能new,受保护的--需要不同包但是子类,所以继承
//获取解析器
DocumentBuilder db=DocumentBuilderFactory.newInstance().newDocumentBuilder();
//D:\MyEclipse 10\xmlDemo
Document dom=db.parse("./src/day4/users.xml");//手动获取Document对象--dom
//Object obj=dom.getElementsByTagName("name");
Node node1=dom.getFirstChild();
System.out.println(node1.getNodeName());//users
//Node中没有getElementsByTagName()方法,而Element中有
//Node:元素(标签),属性,文本内容
//Element:元素(标签)
Node node2=node1.getFirstChild();
System.out.println(node2.getNodeName());//#text
//因为Node没有获取属性的方式,所以必须将Node强制向下转换成Element来处理
//这里dom.getFirstChild()获得的就是Element
Element e1=(Element)dom.getFirstChild();
NodeList nodeList=e1.getElementsByTagName("user");
int len=nodeList.getLength();
for(int i=0;i<len;i++){
// Node n=nodeList.item(i);
Element e=(Element) nodeList.item(i);
System.out.println(e.getNodeName());//user
String id=e.getAttribute("id");
Element nameElement=(Element) e.getElementsByTagName("name").item(0);
String name=nameElement.getTextContent();
System.out.println("id="+id+",name="+name);
}
}
@Test
public void test2() throws Exception{
//DocumentBuilder db=new D...不能new,受保护的--需要不同包但是子类,所以继承
DocumentBuilder db=DocumentBuilderFactory.newInstance().newDocumentBuilder();
//D:\MyEclipse 10\xmlDemo
Document dom=db.parse(new File("./src/day4/users.xml"));//手动获取Document对象--dom
//Object obj=dom.getElementsByTagName("name");
Element root=(Element) dom.getFirstChild();//users--根节点
//Node中没有getElementsByTagName()方法,而Element中有
//Node:元素(标签),属性,文本内容
//Element:元素(标签)
Element user2=(Element) root.getElementsByTagName("user").item(1);
String id=user2.getAttribute("id");
String age= user2.getElementsByTagName("age").item(0).getTextContent();
System.out.println("id="+id+",age="+age);
}
//java对xml文档进行遍历,更新创建删除--CRUD
//
private final String FILE_NAME="./src/day4/users.xml";
@Test
public void test3() throws Exception{
DocumentBuilder db=DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document dom=db.parse(new File(FILE_NAME));
Element root=(Element) dom.getFirstChild();
//获取所有的<user>结点
NodeList nodeList=root.getElementsByTagName("user");
for(int i=0;i<nodeList.getLength();i++){
Element eUser=(Element) nodeList.item(i);
String id=eUser.getAttribute("id");
String name=eUser.getElementsByTagName("name").item(0).getTextContent();
System.out.println("id="+id+",name="+name);
}
}
//修改:把最后一个user的年龄改为60
@Test
public void test4() throws Exception{
DocumentBuilder db=DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document dom=db.parse(new File(FILE_NAME));
Element root=(Element) dom.getFirstChild();
//更新所有的<user>结点
NodeList nodeList=root.getElementsByTagName("user");
int len=nodeList.getLength();
Element eUserLast=(Element) nodeList.item(len-1);
eUserLast.getElementsByTagName("age").item(0).setTextContent("60");//修改的是dom,还要存在文件中
//将内存中的dom对象(树)存储到外面的磁盘中
Transformer t=TransformerFactory.newInstance().newTransformer();
t.transform(new DOMSource(dom), new StreamResult(FILE_NAME));
}
//增加:给xml文档添加一个新的user结点
@Test
public void test5() throws Exception{
DocumentBuilder db=DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document dom=db.parse(new File(FILE_NAME));
Element root=(Element) dom.getFirstChild();
//创建一个新的user结点
Element eUser=dom.createElement("user");
eUser.setAttribute("id", "B001");
Element eUserName=dom.createElement("name");
eUserName.setTextContent("xiaoming");
Element eUserAge=dom.createElement("age");
eUserAge.setTextContent("15");
//把以上元素组成一个子树
eUser.appendChild(eUserName);
eUser.appendChild(eUserAge);
root.appendChild(eUser);
//将内存中的dom对象(树)存储到外面的磁盘中
Transformer t=TransformerFactory.newInstance().newTransformer();
t.transform(new DOMSource(dom), new StreamResult(FILE_NAME));
}
//删除:把xml文档最后一个元素删除
@Test
public void test6() throws Exception{
DocumentBuilder db=DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document dom=db.parse(new File(FILE_NAME));
Element root=(Element) dom.getFirstChild();
//获取最后一个user结点
NodeList nodeList=root.getElementsByTagName("user");
int len=nodeList.getLength();
Element eUser=(Element) nodeList.item(len-1);
eUser.getParentNode().removeChild(eUser);
//将内存中的dom对象(树)存储到外面的磁盘中
Transformer t=TransformerFactory.newInstance().newTransformer();
t.transform(new DOMSource(dom), new StreamResult(FILE_NAME));
}
}
xml文档
<?xml version="1.0" encoding="UTF-8" standalone="no"?><users>
<user id="A001">
<name>jack</name>
<age>23</age>
</user>
<user id="A002">
<name>张三</name>
<age>20</age>
</user>
<user id="A003">
<name>李四</name>
<age>60</age>
</user>
</users>