关于xml解析的几个方法总是喜欢忘记,因此记录下来方便日后查看。
常用解析方法为DOM,SAX,DOM4J,PULL
其中DOM4J为JDOM升级版。
1.XML解析概述
DOM,
SAX:都属于JAXP包
,
JAXP
开发包是
J2SE
的一部分,它由
javax.xml
、
org.w3c.dom
、
org.xml.sax
包及其子包组成。
2.DOM概述:
相关概念
DOM解析是把所有的xml加载到内存中,以树的形式存储,所以使用DOM解析是要牢记一下几点:
a.明确Node概念,明确子节点,父节点等概念,Document是代表整个xml,对应到树中就是root,其子节点就是xml的根标签,所以Document是整个xml文件的入口
b.所有的对象都是Node的子类,如:Element,Attr,Document都是Node的子类
c,Node是树的概念,Element,attr,Document等属性是xml的概念,不要混淆,但是DOM解析是基于树的特点来的,所以对于xml的操作都是基于Node做的
DOM关系图解
DOM常用方法
3.接下来介绍通过DOM对xml文件CRUD.
要解析的xml文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<users>
<user id="001">
<name>张三</name>
<password>abc</password>
</user>
<user id="002">
<name>李四</name>
<password>2</password>
</user>
<user id="003">
<name>王五</name>
<password>3</password>
</user>
<user id="004">
<name>王麻子</name>
<password>5</password>
</user>
<user id="005">
<name>Dean</name>
<password>5</password>
</user>
</users>
JUnit代码如下:
package neuq.test.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.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.NodeList;
import org.xml.sax.SAXException;
/*
*测试Dom解析xml的CRUD方法:
*
*读: 查看所有的数据 有条件的查询数据
*写入:姓名:Dean,id:005,密码:5
*更新:将用户张三的密码更新为abc
*删除:删除所有的user标签,有条件的删除:id=002删除对应的user标签
*
*@author:Dean
*@date:2014-6-23
*
*/
public class DOMTest {
//创建xml文件的对象
File f=new File("D:\\Workspaces\\For Android\\Test\\src\\neuq\\test\\dom\\users.xml");
/*
* 读
*
* 遍历所有节点:打印所有user的所有信息
*
*
*/
@Test
public void testReadAllByDom() throws Exception{
//加载users.xml文件得到一个Document对象
//创建一个文档解析器工厂对象
DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
//根据工程对象得到解析器对象
DocumentBuilder builder=documentBuilderFactory.newDocumentBuilder();
//用解析器对象解析xml文件得到Document对象
Document document=builder.parse(f);
System.out.println(document);
//Document包含xml文件的所有内容
//根据Document拿到根标签users
Element rootEle=document.getDocumentElement();
//根据根标签users拿到所有的子标签user的集合
NodeList nodeList=rootEle.getElementsByTagName("user");
//遍历集合,拿到每个Element,并拿到每个Element内的数据
for(int i=0;i<nodeList.getLength();i++){
Element userEle=(Element) nodeList.item(i);
//拿到id属性
String id=userEle.getAttribute("id");
//拿到name子标签
Element nameEle=(Element) userEle.getElementsByTagName("name").item(0);
//拿到name子标签中的值
String name=nameEle.getTextContent();
//拿到password子标签
Element passwordEle=(Element) userEle.getElementsByTagName("password").item(0);
//拿到password子标签中的值
String password=passwordEle.getTextContent();
//打印出来
System.out.println("id="+id+"----"+"name="+name+"----"+"pasword="+password);
}
}
/*
* 读
*
* 查找某一个节点:查找张三的密码
*
*
*/
@Test
public void testReadSpecifiedByDom() throws Exception{
//加载user.xml文件得到Document对象 直接通过方法链得到
Document document=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
//通过文档拿到根标签
Element rootEle=document.getDocumentElement();
//通过根标签拿到所有子标签的集合NodeList
NodeList nodeList=rootEle.getElementsByTagName("user");
//遍历NodeList
String temp="张三";
for(int i=0;i<nodeList.getLength();i++){
Element userEle=(Element) nodeList.item(i);
//拿到name子标签
Element nameEle=(Element) userEle.getElementsByTagName("name").item(0);
//判断name子标签的text是否为张三
if(temp.equals(nameEle.getTextContent())){
Element passwordEle=(Element) userEle.getElementsByTagName("password").item(0);
String password=passwordEle.getTextContent();
System.out.println(password);
return;
}
}
}
/*
* 删
* 删除某个节点:删除id为008的节点
*
*/
@Test
public void testDeleteByDom() throws Exception{
//加载users.xml得到Document对象
Document document=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
//得到所有user标签的集合
NodeList nodeList=document.getDocumentElement().getElementsByTagName("user");
//遍历这个集合
for(int i=0;i<nodeList.getLength();i++){
//得到user标签对象
Element userEle=(Element) nodeList.item(i);
//得到其属性id
String id=userEle.getAttribute("id");
//判断属性值是否等于008
if("0001".equals(id)){
//相同 删除这个user标签 (用父标签来删除)
userEle.getParentNode().removeChild(userEle);
//将document对象写到users.xml中去
saveDocument(document);
//提示删除成功,return
System.out.println("删除成功!");
return;
}
//没有找到相应的用户
}
System.out.println("没有找到相应用户");
}
/*
* 改
* 更新某一个节点:将用户张三的密码更新为abc
*
*/
@Test
public void testUpdateByDom() throws Exception{
//加载users.xml文件,拿到Document对象
Document document=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
//拿到根标签|
Element rootEle=document.getDocumentElement();
//拿到根标签下所有的子标签
NodeList nodeList=rootEle.getElementsByTagName("user");
//遍历子标签
for(int i=0;i<nodeList.getLength();i++){
//拿到user子标签
Element userEle=(Element) nodeList.item(i);
//拿到name子标签
Element nameEle=(Element) userEle.getElementsByTagName("name").item(0);
//判断 name的text是否为张三
if("张三".equals(nameEle.getTextContent())){
//相同
//拿到password子标签
Element passwordEle=(Element) userEle.getElementsByTagName("password").item(0);
//更改password的text的值
passwordEle.setTextContent("abc");
//保存document对象到文件中区
saveDocument(document);
//提示更改成功,返回
System.out.println("更改成功");
return;
}
}
System.out.println("没有找到指定标签");
//没有找到指定标签,更新失败
}
/*
* 增
* 添加某一个节点: 姓名:Dean,id:005,密码:5
*
*/
@Test
public void testCreateByDom() throws Exception{
//加载users.xml文件,拿到Document对象
Document document=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
//拿到根节点
Element rootEle=document.getDocumentElement();
//创建user子标签
Element userEle=document.createElement("user");
//添加属性
userEle.setAttribute("id", "005");
//创建name,password子标签
Element nameEle=document.createElement("name");
Element passwordEle=document.createElement("password");
//为子标签添加值
nameEle.setTextContent("Dean");
passwordEle.setTextContent("5");
//添加到user标签中去
userEle.appendChild(nameEle);
userEle.appendChild(passwordEle);
//将user标签添加到users标签中去
rootEle.appendChild(userEle);
//保存
saveDocument(document);
//添加成功
System.out.println("添加成功");
}
/*
* javax.xml.transform包中的Tranformer类用于把代表xml文件的Document对象转换为
* 某种格式后进行输出
*
* 将Document对象的数据保存到xml文件中去,与获取Document对象是互逆的过程
*/
private void saveDocument(Document document) throws Exception {
//将Document对象的数据保存到xml文件中去,与获取Document对象是互逆的过程
//获取转换器工厂对象
TransformerFactory transformerFactory=TransformerFactory.newInstance();
//获取转换器实例
Transformer transformer=transformerFactory.newTransformer();
//将document写入到源文件
DOMSource xmlSource=new DOMSource(document);
StreamResult outputTarget=new StreamResult(f);
transformer.transform(xmlSource, outputTarget);
}
}