XML解析之Dom
发布时间:2020-12-16 05:53:39 所属栏目:百科 来源:网络整理
导读:关于xml解析的几个方法总是喜欢忘记,因此记录下来方便日后查看。 常用解析方法为DOM,SAX,DOM4J,PULL 其中DOM4J为JDOM升级版。 1.XML解析 概述 DOM, SAX:都属于JAXP包 , JAXP 开发包是 J2SE 的一部分,它由 javax.xml 、 org.w3c.dom 、 org.xml.sax 包及
关于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:WorkspacesFor AndroidTestsrcneuqtestdomusers.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); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |