XML解析技术其实在前面我们主要讲解是如何的进行XML文件的编写,进而将我们需要的数据存储起来。但是在实际的开发中我们的软件需要将XML中存储的有效数据获取处理进行基本的数据处理。那么我们将获取XML中有效数据称之为XML文件的解析。思考:是否可以使用传统的IO技术进行XML数据解析?可以,但是过于复杂。解决方法:JAXP。JAXP技术JAXP即JavaApiforXmlProcessing该API主要是SUN提供的用于解析XML数据的一整套解决方案,主要包含了DOM和SAX解析技术。大家可以参见SUN的以下两个包:javax.xml.parsers.*主要存储的是解析器org.w3c.dom.*或org.w3c.sax.*主要存储的是DOM解析或SAX解析需要的APIDOM解析主要采用DOM树的方式进行XML的数据解析。如:JavaScript中的DOM操作SAX解析主要采用事件的方式进行XML的数据解析。如:JavaScript中的事件机制XML解析原理具体的解析的原理可以参考以下的图解:1.编写需要解析的XML文件2.获取相应的XML解析器对象3.使用API获取数据4.返回数据给开发者DOM解析DOM解析采用的是DOM树的方式进行解析。1.准备要解析user.xml文件?xmlversion=1.0encoding=UTF-8?!--1.编写要解析的XML文件--users/users2.获取解析器//2.提供获取解析器的方法publicstaticDocumentBuildergetParser()throwsException{//2.1创建工厂类对象DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();//2.2获取解析器对象DocumentBuilderparser=factory.newDocumentBuilder();returnparser;}3.获取解析的DOM树对象//3.提供获取DOM数据的方法publicstaticDocumentgetDOM(Filefile)throwsException{//3.1获取解析器DocumentBuilderparser=getParser();//3.2解析数据Documentdom=parser.parse(file);returndom;}4.获取根元素//4.提供解析根元素的数据的方法publicstaticvoidgetRoot(Filefile)throwsException{//4.1获取DOM树Documentdom=getDOM(file);//4.2遍历dom树找根元素Nodenode=dom.getElementsByTagName(users).item(0);//4.3输出根元素的名System.out.println(node.getNodeName());}5.通过关系获取根元素//4.提供解析根元素的数据的方法publicstaticvoidgetRoot(Filefile)throwsException{//4.1获取DOM树Documentdom=getDOM(file);//4.2遍历dom树找根元素Nodenode=dom.getElementsByTagName(users).item(0);//4.3输出根元素的名System.out.println(node.getNodeName());//4.4根据节点直接的关系获取根元素NodeListlist=dom.getChildNodes();Noderoot=list.item(0);System.out.println(root.getNodeName());root=dom.getFirstChild();System.out.println(root.getNodeName());root=dom.getLastChild();System.out.println(root.getNodeName());}6.添加元素//5.添加一个user节点publicstaticDocumentaddElement(Filefile)throwsException{//5.1获取DOM树Documentdom=getDOM(file);//5.2创建user元素Elementuser=dom.createElement(user);Elementname=dom.createElement(name);Elementage=dom.createElement(age);Elementaddress=dom.createElement(address);name.setTextContent(张三);age.setTextContent(28);address.setTextContent(金平区);//5.3建立关系Elementroot=(Element)dom.getFirstChild();user.appendChild(name);user.appendChild(age);user.appendChild(address);root.appendChild(user);//5.4返回修改后的DOM树对象returndom;}7.为了让内存中的修改的DOM树持久化到磁盘文件需要定义以下方法//提供一个工具方法将内存中的DOM树存储到磁盘的指定文件中publicstaticvoidwriteDOM2XML(Documentdom,Filefile)throwsException{//1.获取转换器的工厂类对象TransformerFactoryfactory=TransformerFactory.newInstance();//2.获取转换器对象Transformertrans=factory.newTransformer();//3.转换trans.transform(newDOMSource(dom),newStreamResult(newFileOutputStream(file)));}思考:以上的代码为什么可以直接的处理中文?文件本身是UTF-8编码存储的和使用的是字节流。8.修改元素//6.修改第二个user的年龄为30岁publicstaticDocumentmodifyElement(Filefile)throwsException{//6.1获取DOM树Documentdom=getDOM(file);//6.2获取第二个age元素Nodeage2=dom.getElementsByTagName(age).item(1);//6.3设置文本值age2.setTextContent(30);returndom;}9.删除元素//7.删除第一个user节点publicstaticDocumentremoveElement(Filefile)throwsException{//7.1获取DOM树Documentdom=getDOM(file);//7.2获取user的父亲Nodeusers=dom.getFirstChild();//7.2获取需要断绝关系的孩子节点Nodeuser1=dom.getElementsByTagName(user).item(0);//7.3断绝关系users.removeChild(user1);returndom;}以上的代码存在代码的重复。publicstaticDocumentremoveElement(Filefile)throwsException{//7.1获取DOM树Documentdom=getDOM(file);//7.2获取user的父亲Nodeusers=dom.getFirstChild();Nodeuser1=users.getChildNodes().item(1);users.removeChild(user1);returndom;}10.加强使用关系获取元素//8.使用关系获取节点publicstaticvoidsearchElement(Filefile)throwsException{//8.1获取DOM树Documentdom=getDOM(file);//8.2获取第二个user的所有的子元素并输入元素名Elementuser2=(Element)dom.getElementsByTagName(user).item(1);//8.3获取所有的儿子NodeListlist=user2.getChildNodes();//8.4遍历所有的孩子for(inti=0;ilist.getLength();i++){Nodenode=list.item(i);System.out.println(node.getNodeName());}//8.5获取第二个user的address元素Elementaddress2=(Element)list.item(2);System.out.println(address2.getNodeName());Nodeage2=address2.getPreviousSibling();System.out.println(age2.getNodeName());Elementname2=(Element)list.item(0);System.out.println(name2.getNodeName());age2=name2.getNextSibling();System.out.println(age2.getNodeName());}可以参见以下的关系图:11.属性的操作//9.属性操作publicstaticDocumentoptionAttribute(Filefile)throwsException{//9.1获取DOM树Documentdom=getDOM(file);//9.2获取所有的user元素NodeListlist=dom.getElementsByTagName(user);//9.3遍历节点for(inti=0;ilist.getLength();i++){Elementuser=(Element)list.item(i);//添加属性user.setAttribute(id,00+(i+1));}//9.4获取属性Elementuser2=(Element)list.item(1);Stringvalue=user2.getAttribute(id);System.out.println(value);//9.5修改属性user2.setAttribute(id,007);//9.5删除属性user2.removeAttribute(id);returndom;}总结:在实际的项目开发中我们经常遇到的XML数据时比较大的,如果使用DOM进行数据的解析,那么首先在内存中会形成一个DOM树结构。因此容易导致内存的一个溢出。所以不建议大家使用DOM解析进行操作较大的XML数据。如果只是需要进行XML文件的数据获取,那么推荐使用SAX解析。SAX解析SAX即SimpleApiforXml就是一个简单的操作XML数据的一套SUN提供的API机制。SAX采用的解析的原理是基于事件触发的机制。SAX技术只能进行XML数据的读取。1.准备需要解析的XML文件linkmans.xml?xmlversion=1.0encoding=UTF-8standalone=no?linkmanslinkmannamejack/namephone18663243245/phoneemailjack@163.com/email/linkmanlinkmanname张三/namephone1353243247/phoneemailzs@126.com/email/li