《Web开发技术—XML解析.pptx》由会员分享,可在线阅读,更多相关《Web开发技术—XML解析.pptx(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、XML文档解析的概念DOM解析XML的方法SAX解析XML的方法目标第1页/共25页XML解析:读入一个XML文件,确认这个文件具有正确的格式,然后将其分解成各种元素,使得程序员能够方便的得到这些元素。(注:XML文档的解析是程序员处理XML的前提,是由解析器完成的。很多公司都提供了解析器的实现,如:APACHE,IBM等)DOM:(DocumentObjectModel)文档对象模型,W3C标准,解析器将读入的XML文档转换成树结构,每个元素对应树结构的一个结点,这样程序员操作树结构来操作XML元素。SAX:(TheSimpleAPIforXML):解析器读入XML文档,并根据元素生成相应的
2、事件。XML解析的概念第2页/共25页XML常用的解析技术常用的解析技术DOM:DocumentObjectModel,文档对象模型JDOMSAX例:students.xml,DOMParse.java XML常用的解析技术常用的解析技术第3页/共25页DOM举例-Xml文件:DOM解析第4页/共25页DOM结构DOM解析第5页/共25页DOM的包结构org.w3c.dom.Document:定义分析、创建DOM文档的一系列方法,是操作DOM的基础。org.w3c.dom.Element:提供了获取,修改XML元素名字和属性的方法;org.w3c.dom.Node:提供了处理节点和子节点的方法
3、。org.w3c.dom.NodeList:提供了获得节点个数和当前节点的方法,这样就可以迭代的访问各个节点。第6页/共25页常用DOM方法Document.getDocumentElement():返回 DOM 树的根。(该函数是 Document 接口的一个方法,没有定义其他的 Node 子类型。)Node.getFirstChild()和 Node.getLastChild():返回给定 Node 的第一个和最后一个孩子。Node.getNextSibling()和 Node.getPreviousSibling():返回给定 Node 的下一个和上一个兄弟。Element.getAtt
4、ribute(String attrName):对于给定的 Element,返回名为 attrName 的属性的值。如果需要 id 属性的值,可以使用 Element.getAttribute(id)。如果该属性不存在,该方法返回一个空字符串()。DOM解析第7页/共25页DocumentBuilderFactory.newDocumentBuilder().parse()/解析一个外部的XML文件,得到一个Document对象的DOM树DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument()/初始化一棵DO
5、M树Document.getDocumentElement().appendChild()/为一个标签结点添加一个子结点Document.createTextNode()/生成一个字符串结点Node.getChildNodes()/取得某个结点的所有下一层子结点Node.removeChild()/删除某个结点的子结点Document.getElementsByTagName()/查找所有指定名称的标签结点Document.getElementById()/查找指定名称的一个标签结点,如果有多个符合,则返回某一个,通常是第一个Element.getAttribute()/取得一个标签的某个属性
6、的的值Element.setAttribute()/设置一个标签的某个属性的的值Element.removeAttribute()/删除一个标签的某个属性TransformerFactory.newInstance().newTransformer().transform()/将一棵DOM树写入到外部XML文件第8页/共25页DOM解析关键代码DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();Stringpath=d:/internet应用解决方案/材料/demo.xml;FilexmlFile=newFile
7、(path);DocumentBuilderbuiler=factory.newDocumentBuilder();/创建一个解析器对象 doc=builer.parse(newFile(path);/使解析器指向您的 XML 文档 DOM解析第9页/共25页SAX解析SAXvsDOM:DOM在内存中建立XML文档树。如果文档非常大,DOM树可能需要很大的内存。DOM树包括许多对象表示XML源文档的内容。如果只需要文档中的少量信息,创建所有这些对象是一种浪费。DOM解析器必须在代码访问之前建立整个DOM树。如果解析非常大的XML文档,在等待解析器完成之前会有明显的延迟。第10页/共25页SAX
8、解析SAX解析XML的基本步骤:首先获得一个实现了SAX接口的解析器写一个符合SAX标准的处理器类,并且把这个类注册到刚做好的解析器解析器会把XML文件作为一个流读出来,然后再把文件流转换成一个事件流,这个事件流中的内容包括“文档开始”、“文档结束”、“元素开始”、“元素结束”根据事件调用注册到解析器里的处理器里面的相应的方法,在解析器进行XML文件解析的同时,应用程序可以调用解析器提供的方法,对解析器的行为进行控制或获取解析器的状态。第11页/共25页SAX解析第12页/共25页SAX解析SAXAPISAXParserFactory:SAXParserFactory对象用来按照系统属性中的定
9、义创建一个分析器的实例。Parser:org.xml.sax.Parser接口定义了类似setDocumentHandler的方法来创建事件处理函数。另外,该接口中还定义parser(URI)方法来对XML文档进行实际的分析工作。ContentHandler:当分析器遇到XML文档中的标记时,就会激活该接口中的startDocument,endDocument,startElement以及endElement等方法。另外,characters方法以及processingIstruction方法也是在ContentHandler接口中实现的。当分析器遇到元素内部的文本内容时就会激活charact
10、ers方法,当分析器遇到处理指令时就会激活processingIstruction方法。ErrorHandler:当分析器在分析过程中遇到不同的错误时,ErrorHandler接口中的error,fatalError或者warning方法就会被激活。DTDHandler:当处理DTD中的定义时,就会调用该接口的方法。EntityResolver:当分析器要识别由URI定义的数据时,就会调用该接口中的resolveEntity方法。第13页/共25页每个结点有三个属性:以上方法来自于org.w3c.dom.Node另外,只有解析器开启名字空间支持(),则调用getLocalName()和getN
11、amespaceURI()得到本地名和URI才不会为NULLSAX解析第14页/共25页SAX解析SAX编程实例:/需要引入下面的包importorg.xml.sax.helpers.DefaultHandler;importjavax.xml.parsers.*;importorg.xml.sax.*;importorg.xml.sax.helpers.*;importjava.util.*;importjava.io.*;第15页/共25页SAX解析public class SAXCounter extends DefaultHandler private Hashtable tags;/
12、这个Hashtable用来记录tag出现的次数/处理文档前的工作public void startDocument()throws SAXException tags=new Hashtable();/初始化Hashtable/对每一个开始元属进行处理public void startElement(String namespaceURI,String localName,String qName,Attributes atts)throws SAXException String key=rawName;Object value=tags.get(key);System.out.printl
13、n(tag名称:+key);if(value=null)/如果是新碰到的标签,这在Hastable中添加一条记录tags.put(key,new Integer(1);else/如果以前碰到过,得到其计数值,并加1int count=(Integer)value).intValue();count+;tags.put(key,new Integer(count);第16页/共25页SAX解析/解析完成后的统计工作publicvoidendDocument()throwsSAXExceptionEnumeratione=tags.keys();while(e.hasMoreElements()S
14、tringtag=(String)e.nextElement();intcount=(Integer)tags.get(tag).intValue();System.out.println(Tagoccurs+count+times);第17页/共25页SAX解析/程序入口,用来完成解析工作staticpublicvoidmain(Stringargs)Stringfilename=src/soap1.xml;SAXParserFactoryspf=SAXParserFactory.newInstance();SAXParsersaxParser=null;try/创建一个解析器SAXPars
15、er对象saxParser=spf.newSAXParser();/得到SAXParser中封装的SAXXMLReadercatch(Exceptionex)System.err.println(ex);System.exit(1);try/使用指定的ContentHandler,解析给XML文件,saxParser.parse(filename,newSAXCounter();System.out.println(ok);catch(SAXExceptionse)System.err.println(se.getMessage();System.exit(1);catch(IOExcepti
16、onioe)System.out.println(ioe);System.exit(1);第18页/共25页JDOMJDOM针对文档对象模型的复杂性,人们提出了另外一种解决方案,即JDOM。它由BrettMcLaughlin和Jason所创建,使用80-20法则为最常用的80%的XML处理功能提供一种简单的API。JDOM并没有尝试替代DOM,目前还只能用于Java语言。第19页/共25页JDOM特点:JDOM是Java平台专用的没有层次性第20页/共25页JDOMJDOM编程创建一个Document:ElementcarElement=newElement(car);DocumentmyDo
17、cument=newDocument(carElement);添加一个AttributecarElement.addAttribute(newAttribute(vin,123fhg5869705iop90);元素和子元素Elementmake=newElement(make);make.addContent(Toyota);carElement.addContent(make);用简洁形式添加元素carElement.addContent(newElement(make).addContent(Toyota);第21页/共25页JDOM添加其余的元素carElement.addContent
18、(newElement(model).addContent(Celica);carElement.addContent(newElement(year).addContent(1997);carElement.addContent(newElement(color).addContent(green);carElement.addContent(newElement(license).addContent(1ABC234).addAttribute(state,CA);添加一条注释carElement.addContent(newComment(Descriptionofacar);访问子元素
19、ElementyearElement=carElement.getChild(year);除去子元素booleanremoved=carElement.removeChild(year);第22页/共25页JDOM将JDOM转化为XML文本tryXMLOutputteroutputter=newXMLOutputter(,true);outputter.output(myDocument,System.out);catch(java.io.IOExceptione)e.printStackTrace();使用FileWriter输出XMLFileWriterwriter=newFileWriter(/some/directory/myFile.xml);outputter.output(myDocument,writer);writer.close();第23页/共25页总结 DOM及DOM 解析的原理 DOM的接口和常用APISAX及SAX解析的原理SAX的接口和常用APIJDOM编程简单介绍了DOM4j第24页/共25页谢谢您的观看!第25页/共25页
限制150内