《Java处理XML》PPT课件.ppt_第1页
《Java处理XML》PPT课件.ppt_第2页
《Java处理XML》PPT课件.ppt_第3页
《Java处理XML》PPT课件.ppt_第4页
《Java处理XML》PPT课件.ppt_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java高级程序设计第四章,Java处理XML,回顾,数组与其它容器的区别体现在三个方面:效率,类型识别以及可以持有基本类型的数据。 java.util 里面有一个Arrays 类,它包括了一组可用于数组的static方法,这些方法都是一些实用工具。 Java2 的容器类要解决“怎样持有对象”,而它把这个问题分成两大类: Collection和Map。 容器的选择和常用容器的使用及实现,本章目标,了解Java处理XML的几种解析工具 了解DOM API 使用DOM解析XML文件 使用SAX解析XML文件 使用JDOM解析XML文件 使用dom4j解析XML文件,XML的概念,XML即可扩展的标记语言,可以定义语义标记(标签),是元标记语言。XML不像超文本标记语言HTML,HTML只能使用规定的标记,对于XML,用户可以定义自己需要的标记。 XML(eXtensible Markup Language)和HTML(Hyper Text Markup Language)师出同门,都是从SGML(Standard Generalized Markup Language)延伸而出的标记语言,XML解析,Java处理XML的相关工具,JAXP DOM JDOM SAX dom4j,JAXP,JAXP是Java API for XML Processing的英文字头缩。 用于XML文档处理的使用Java语言编写的编程接口。 JAXP支持DOM、SAX、XSLT等标准。 JAXP既可以和具体实现DOM API、SAX API 的各种XML解析器联合工作,又可以和具体执行XSLT标准的XSLT处理器联合工作。 JAXP 不提供语法分析功能。,DOM,DOM,Document Object Model,文档对象模型。 DOM是html和xml文档的编程接口规范,和平台、语言是无关的。 利用dom规范,能够实现dom 文档和xml之间的相互转换,遍历、操作相应dom文档的内容。 DOM规范的核心就是树模型。,JDOM,JDOM是Java和DOM的结合体。 JDOM 致力于建立一个完整的基于 Java 平台的、通过 Java 代码来访问、操作并输出 XML 数据。 JDOM是用Java语言读、写、操作XML的新API函数。 简单、高效、优化。,SAX,SAX,Simple API For XML。 非W3C官方所提供的标准,“民间”的事实标准。 SAX在概念上与DOM完全不同。 非文档驱动,是事件驱动的。 事件驱动:一种基于回调机制的程序运行方法。 SAX解析器装载XML文件时,它遍历XML文档并在其主机应用程序中产生事件(经由回调函数、指派函数或者任何可调用平台完成这一功能)表示这一过程。,dom4j,dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。 性能优异 功能强大 简单易用 开放源代码。,使用DOM操作XML-基本原理,使用DOM操作XML-工作原理,DOM将文档中的所有都看作节点,因此定义了一个最基础的接口是Node,它的字接口包括Element,Attr,Text等等,还包括了 Document,也就是说DOM将整个文档看作是一个节点。 在Node中定义了很多方法, 包括了读取节点(getFirstChild(), getNextSibling(), getLastNode(), getChildNodes(), getNodeName(), getNodeType(), getNodeValue(), getParentNode(), getAttributes(), getOwnerDocuemt())、 修改节点(insertBefore(), removeChild(), appendChild(), replaceChild(), setNodeValue()),这些方法都非常常用,但是没有定义创建节点的方法, 创建节点的方法是在它的子接口Document中定义的 (createXXX()),也没有定义按节点名字来得到节点的方法,这些方法是在Element和Document中定义的 (getElementById(), getElementByTagName(), 注意在这里按照名字直接得到的是Element),优缺点,DOM在解析文档的时候按整个文档的结构生成一棵树,全部保存在内存中,这既产生了一些优点,也产生了一些缺点。优点就是整个文档都一直在内存中,我们可 以随时访问任何节点,并且对树的遍历也是比较熟悉的操作;缺点则是耗内存,并且必须等到所有的文档都读入内存才能进行处理。 一个需要注意的地方就是,XML文档两个标签之间的空白也是这棵树的一个节点(Text节点),DOM类的介绍,DocumentBuilderFactory类,DocumentBuilderFactory类是一个抽象类,该类主要用于定义工厂API,使应用程序能够从XML文档获取生成DOM对象树的解析器。该类位于javax.xml.parsers包中,只有一个受保护的构造方法。其构造方法如下:,protected DocumentBuilderFactory( )方法:用于阻止实例化的受保护构造方法。,该类还包括以下几种常用的方法:,static DocumentBuilderFactory newInstance( )获取DocumentBuilderFactory的新实例,static DocumentBuilderFactory newInstance(String factoryClassName, ClassLoader classLoader),void setValidating(boolean validating)指定是否由此代码生成的解析器来验证被解析的文档。,abstract DocumentBuilder newDocumentBuilder( ),void setIgnoringComments(boolean ignoreComments)指定由此代码生成的解析器是否忽略注释,void setExpandEntityReferences(boolean expandEntityRef):指定由此代码生成的解析器是否扩展实体引用节点。,DocumentBuilder类,DocumentBuilder类是一个抽象类,主要用于从XML文档获取DOM文档实例。可以通过DocumentBuilderFactory.newDocumentBuilder();代码获取此类的实例。获取此类的实例之后,将可以从各种输入流来解析XML。,protected DocumentBuilder( )。,DocumentBuilder类其他的常用方法如下:,(1)Document parse(String uri)方法:将给定URI的内容解析为一个XML文档,并且返回一个新的DOM Document对象。,(3)void reset( )方法:将此DocumentBuilder重置为其原始配置。,(2)abstract Document newDocument( )方法:获取DOM Document对象的一个新实例来生成一个DOM树。,(5)abstract void setErrorHandler(ErrorHandler eh)方法:指定解析器要使用的ErrorHandler。,该类有一个受保护的构造方法 如下:,(4)abstract void setEntityResolver(EntityResolver er)方法:指定使用EntityResolver解析要解析的XML文档中存在的实体。,使用DOM接口操作XML-Documen接口,Node接口是其他大多数接口的父类,像Document、Element、Attribute、Text、Comment等接口都是从Node接口继承过来的。它表示该文档树中的单个节点。,常用的方法有以下几种:,Node appendChild(Node newChild)方法:将节点newChild添加到此节点的子节点列表的末尾。,NamedNodeMap getAttributes()方法:返回包含此节点的属性的NamedNodeMap对象;否则为null。,Node getFirstChild()方法:此节点的第一个子节点。,Node getLastChild()方法:此节点的最后一个节点。,Node getNextSibling()方法:直接在此节点之后的节点。,String getNodeValue()方法:此节点的值,取决于其类型;,Node getParentNode()方法:此节点的父节点。,Node removeChild(Node oldChild)方法:从子节点列表中移除oldChild所指示的子节点,并将其返回。,注意:在DOM中每个元素的字符数据(元素值)也是一个Node对象。,使用DOM操作XML- Node接口,使用DOM操作XML-NodeList接口,NamedNodeMap接口,实现NamedNodeMap接口的对象用于表示可以通过名称访问的节点的集合。,NamedNodeMap表示的是一组节点和其唯一名称的一一对应关系,这个接口主要用在属性节点的表示上。,在实现NamedNodeMap的对象中所包含的Node对象还可以通过顺序索引进行访问,但并不意味着DOM指定这些节点的顺序。,在DOM中NamedNodeMap对象也是不断变化的。,NamedNodeMap接口主要方法,NamedNodeMap接口主要有以下几种方法:,int getLength()方法:返回该NamedNodeMap对象中的节点数。,Node getNamedItem(String name)方法:返回名称为name的节点。,Node getNamedItemNS(String namespaceURI, String localName)方法:返回通过本地名称和名称空间URI所指定的节点。,Node removeNamedItemNS(String namespaceURI, String localName)方法:移除通过本地名称和名称空间URI所指定的节点。,Node item(int index)方法:返回索引值为index的项。,Node removeNamedItem(String name)方法:移除名称为name的节点。,Node setNamedItemNS(Node arg)方法:使用其namespaceURI和localName添加节点。,Node setNamedItem(Node arg)方法:使用节点名称添加节点。,实现步骤:,1、创建Document 创建一个文档的过程是非常固定的,三步走 2、浏览XML文档的内容 获得Document后的第一步就是获得root element,也叫document element :getDocumentElement() 3、修改XML文档 修改包含两方面的内容,一方面是修改已有的,另一方面是创建新的节点加入到文档中去.修改已有的节点值,找到目标节点,然后调用Node.setNodeValue()就可以了,对Attr来说则是调用setValue();而修改已有的节点,则用replaceChild();删除一个节点用removeChild()。 创 建新节点时,是用Document来创建的。创建好后就可以使用append()或insertBefore()来插入到合适的地方。此外 Attr总是比较特殊,为一个元素添加属性需要用setAttribute()方法,而删除属性则要用removeAttribute()方法。 4、返回值NodeList和NamedNodeMap 5、输出XML文档,例子1:,import javax.xml.parsers.*; import org.w3c.dom.*; public class TestNamedNodeMap public static void main(String args ) try DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); Document doc=builder.parse(“student.xml“); NodeList list=doc.getElementsByTagName(“student“); for (int i=0;ilist.getLength();i+) Node node=list.item(i); NamedNodeMap np=node.getAttributes(); System.out.println(“第“+(i+1) +“个student元素的属性信息:“); for(int j=0;jnp.getLength();j+) Node attr=np.item(j); System.out.println(attr.getNodeName()+“=“ +attr.getNodeValue()+“); System.out.println(); catch(Exception e)e.printStackTrace(); ,获得属性集合,运行效果图,student.xml的文件内容如下:,NodeList和Node示例,test.xml文件的内容如下:, zhangsan 20 china lisi 25 china ,NodeList和Node示例,import javax.xml.parsers.*; import org.w3c.dom.*; public class TestNode public static void main(String args ) try DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); Document doc=builder.parse(“test.xml“); NodeList list=doc.getElementsByTagName(“student“); for (int i=0;ilist.getLength();i+) Element node=(Element)list.item(i); System.out.print(“name: “); System.out.println (node.getElementsByTagName (“name“).item(0).getFirstChild().getNodeValue(); System.out.print(“age: “); System.out.println (node.getElementsByTagName(“age“). item(0).getFirstChild().getNodeValue(); System.out.print(“address: “); System.out.println (node.getElementsByTagName (“address“).item(0).getFirstChild().getNodeValue(); System.out.println(); catch(Exception e)e.printStackTrace(); ,打印address元素的信息,打印元素name的信息,打印age元素的信息,使用递归解析DOM树,public static void digui(NodeList list)/递归显示所有的节点内容 for(int i =0; i“); digui(nlist); else if(!node.getNodeValue().trim().equals(“) System.out.print(node.getNodeValue(); /System.out.println(“); if(node.hasChildNodes() System.out.println(“); ,使用递归解析DOM树的主要思想是对节点进行递归,判断是否有子节点。如果有就打印出元素名,然后继续判断。反之就是字符数据,将其打印出来。如下:,调用函数自身,使用DOM操作XML-Element接口,使用DOM操作XML-Attr接口,Attr对象继承Node接口,表示Element对象中的属性。 但由于“属性”实际上不是一个子节点,DOM不会将它们看作文档树的一部分。 DOM认为元素的属性是其特性,而不是一个来自于它们所关联的元素的独立的身份。,使用DOM操作XML-读取XML,建立一个解析器工厂。 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();,利用DocumentBuilder的parse()方法接受一个XML文档名作为输入参数,返回一个Document对象。Document对象代表了一个XML文档的树模型。 Document doc=builder.parse(“books.xml“);,以利用这个工厂来获得一个具体的解析器对象。 DocumentBuilder builder=dbf.newDocumentBuilder();,使用DOM操作XML-读取XML,通过Node对象的getNodeValue()方法提取某个标签内的内容。 node.getElementsByTagName(“NAME“).item(0).getFirstChild().getNodeValue(),使用Document对象的getElementsByTagName()方法,得到一个NodeList对象,它是XML文档中的标签元素列表,可以使用NodeList对象的item()方法来得到列表中的每一个Node对象。 NodeList nl =doc.getElementsByTagName(“book“); For(int i=0;in1.getlength();i+) Element node=(Element) nl.item(i); ,使用DOM操作XML-读取XML,public static ArrayList getBookArrayList(String uri) ArrayList list = new ArrayList(); try DocumentBuilderFactory DBfactory = DocumentBuilderFactory.newInstance(); DocumentBuilder DBbuilder = DBfactory.newDocumentBuilder(); Document doc = DBbuilder.parse(uri); NodeList nodeList = doc.getElementsByTagName(“book“); for (int i = 0; i nodeList.getLength(); i+) String booktitle = doc.getElementsByTagName(“booktitle“).item(i). getFirstChild().getNodeValue(); String author = doc.getElementsByTagName(“author“).item(i). getFirstChild().getNodeValue(); String price = doc.getElementsByTagName(“price“).item(i).getFirstChild(). getNodeValue(); Book book = new Book(); book.setBookTitle(booktitle); book.setAuthor(author); book.setPrice(price); list.add(book); catch (Exception e) e.printStackTrace(); return list; ,使用DOM操作XML-创建XML,public static void main(String args) throws Exception /DOM工厂创建document对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document document = db.newDocument(); /在内存中组织DOM对象 document.setXmlVersion(“1.0“); Element root = document.createElement(“root“); Attr atr = document.createAttribute(“id“); atr.setValue(“aa“); root.setAttributeNode(atr); root.appendChild(document.createElement(“书“); document.appendChild(root); /创建Xml文件转换器 TransformerFactory tranf = TransformerFactory.newInstance(); Transformer trans = tranf.newTransformer(); /给文件转换器设置字符编码 trans.setOutputProperty(“encoding“, “utf-8“); /定义转换器输入对象 DOMSource source = new DOMSource(document); /定义转换器输出对象 Result target = new StreamResult(“test.xml“); trans.transform(source, target); ,建立和更新XML文档2,人工建立DOM树,import javax.xml.parsers.*; import org.w3c.dom.*; import org.apache.crimson.tree.XmlDocument; public class JianXML1 public static void main(String args )throws Exception DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance(); DocumentBuilder db=factory.newDocumentBuilder(); Document doc=db.newDocument(); /添加根元素 Element root=doc.createElement(“person“); doc.appendChild(root); /添加元素“student”为“person”的子元素 Element e_student=doc.createElement(“student“); root.appendChild(e_student); /为元素“student”添加属性 Attr a=doc.createAttribute(“bianhao“); a.setNodeValue(“A001“);,e_student.setAttributeNode(a); Element e_name=doc.createElement(“name“); e_student.appendChild(e_name); /为元素“name”添加字符数据信息 Text t=doc.createTextNode(“zhangsan“); e_name.appendChild(t); /调用XmlDocument类的write()方法 XmlDocument xmldoc=(XmlDocument)doc; xmldoc.write(System.out); /导入crimson.jar包 ,运行效果图,使用XmlDocument类更新文档,XmlDocument是org.apache.crimson.tree包中的一个类,并不包含于标准的JAXP中。在我们使用该类时必须要加载相应的类库到JDK中。,使用XmlDocument类主要是应用该类的write()方法,有如下三种形式:,public void write (Writer out, String encoding),public void write (OutputStream out),public void write (Writer out),XmlDocument xmldom=(XmlDocument)doc; xmldom.write(new FileOutputStream(new File(“Xmldom.xml“);,使用write()方法将DOM树保存为文件的形式 ,如下:,doc是一个Document对象实例(强制类型转换),使用TransformerFactory类和Transformer类更新文档,TransformerFactory类的实例可用于创建Transformer和Templates对象。该类位于javax.xml.transform包中。该类是一个抽象类。它的默认构造方法受到有意保护。主要有以下几种常用方法:,abstract Templates newTemplates(Source source)方法:将Source处理为Templates对象,后者是源编译后的表示形式。,static TransformerFactory newInstance()方法:获取TransformerFactory的新实例。,static TransformerFactory newInstance(String factoryClassName, ClassLoader classLoader)方法:根据类名称获得一个新TransformerFactory实例。,abstract Transformer newTransformer( )方法:返回执行从Source到Result的复制的新 Transformer。,TransformerFactory类,Transformer类,Transformer类的实例可以处理来自不同源的XML,并将转换输出写入各种接收器。该类位于javax.xml.transform包中。该类是一个抽象类。它的默认构造方法受到有意保护。但可以通过TransformerFactory.newTransformer方法获取该类的实例。主要的常用方法有以下几种:,abstract void setErrorListener(ErrorListener listener)方法:设置转换的实际错误事件侦听器。,abstract void transform(Source xmlSource, Result outputTarget)方法:将XML Source转换为Result。,void reset()方法:将此Transformer重置为其初始配置。,abstract void setOutputProperties(Properties oformat)方法:设置转换的输出属性。,DOMSource doms = new DOMSource (doc); StreamResult sr = new StreamResult(new FileOutputStream(new File(“a.xml“); TransformerFactory tf=TransformerFactory.newInstance(); Transformer t=tf.newTransformer (); t.transform(doms,sr);,使用TransformerFactory和Transformer类更新文档的主要思想是: 调用TransformerFactory类的静态方法newInstance( )获得一个TransformerFactory对象,由该对象的newTransformer()方法创建了一个Transformer对象。调用Transformer对象的transform()方法即可。注意 transform()方法需要两个参数第一个参数是DOMSource对象(与DOM树有关),第二个参数是StreamResult对象(与输出有关)。,使用方法如下:,doc是一个Document对象实例,从因特网上获取天气数据示例,public static Document getDocument(DocumentBuilder db, String urlString) try URL url=new URL(urlString); URLConnection URLconnection=url.openConnection(); HttpURLConnection httpConnection=(HttpURLConnection)URLconnection; int responseCode=httpConnection.getResponseCode(); if(responseCode=HttpURLConnection.HTTP_OK) InputStream in=httpConnection.getInputStream(); Document doc=db.parse(in); return doc; else System.out.println(“HTTP connection response HTTP_OK“); catch(Exception e) e.printStackTrace() ; return null; ,将纯URLConnection强制转型为HttpURLConnection,按URL字符串打开一个URLConnection。由于我们知道天气站点是通过HTTP请求进行操作的,所以可以将纯URLConnection强制转型为HttpURLConnection。接着,测试来自服务器的响应代码。如果通过,那么就打开连接流。解析器开始解析数据流并把数据流转换成Document。,public static void main(String args ) try String cityname=“beijing“; String url=“/forexml.cgi?“+ cityname; DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); Document doc=new SelectWeather().getDocument(builder,url); NamedNodeMap np1= doc.getElementsByTagName(“forexml“).item(0).getAttributes(); for(int j=0;jnp1.getLength();j+) Node attr1=np1.item(j); System.out.println(attr1.getNodeName()+“=“+ attr1.getNodeValue(); NamedNodeMap np2=doc.getElementsByTagName ( “observation“).item(0).getAttributes(); for(int j=0;jnp2.getLength();j+) Node attr2=np2.item(j); System.out.println(attr2.getNodeName()+“=“+ attr2.getNodeValue(); NamedNodeMap np3=doc.getElementsByTagName (“almanac“).item(0).getAttributes(); for(int j=0;jnp3.getLength();j+) Node attr3=np3.item(j); System.out.println(attr3.getNodeName()+“=“+ attr3.getNodeValue(); catch(Exception e)e.printStackTrace(); ,城市名称,天气站点,/ig/api?weather=Changsha,用SAX操作XML基本原理,XML 解析器,特定于应用程序的处理器,SAX API,XML 文档,输出,XML 处理器,输入,用SAX操作XML基本原理,SAX 工作原理:顺序解析,事件驱动,程序,main(.),startDocument(.) startElement(.) characters(.) endElement( ) endDocument( ),Sax 解析器,用户,提供的,处理程序,XML,输入,事件,SAX的原理,SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。,大多数SAX实现都会产生以下类型的事件:,在文档内每一XML元素接受解析的前后触发元素事件。,在文档的开始和结束时触发文档处理事件。,在处理文档的DTD或Schema时产生DTD或Schema事件。,任何元数据通常都由单独的事件交付。,产生错误事件用来通知主机应用程序解析错误。,对于如下文档: Hello, world! 在解析文档的过程中会产生如下一系列事件:,start document start element: doc start element: para characters: Hello, world! end element: para end element: doc end document,一个完整的SAX处理 过程涉及如下几个步骤:,(1)创建事件处理程序。,(2)创建SAX解析器。,(4)对文档进行解析,将每个事件发送给处理程序。,(3)将事件处理程序分配给解析器。,SAX的优缺点,SAX的优点:,解析速度快,ContentHandler对象可以是多个,内存消耗少,SAX的缺点:,必须实现事件处理程序,不能修改文档,不能随机访问,SAX解析器对文档的解析过程是一种边解析边执行的过程,SAX解析器对文档的解析过程中,无需把整个文档都加载到内存中,使用SAX解析器时,可以注册多个ContentHandler对象,并行接收事件,SAX解析器对文档的解析是顺序进行的,使用SAX对文档进行解析,只能访问文档内容,无法做到向文档中添加节点,更不能删除和修改文档中的内容。,用SAX操作XML常用事件,SAX的常用接口介绍,ContentHandler接口,ContentHandler是Java类包中一个特殊的SAX接口,位于org.xml.sax包中。该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,比如文档的开头和结束、元素开头和结束、以及元素中的字符数据等事件。当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件。,ContentHandler接口的方法有以下几种:,void startDocument(),void characters(char ch, int start, int length),void endDocument(),void startElement(String uri, String localName, String qName, Attributes atts),void endElement(String uri, String localName, String qName),DTDHandler接口,DTDHandler用于接收基本的DTD相关事件的通知。该接口位于org.xml.sax包中。此接口仅包括DTD事件的注释和未解析的实体声明部分。SAX解析器可按任何顺序报告这些事件,而不管声明注释和未解析实体时所采用的顺序;但是,必须在文档处理程序的startDocument()事件之后,在第一个startElement()事件之前报告所有的DTD事件。,DTDHandler接口包括以下两个方法:,void startDocumevoid notationDecl(String name, String publicId, String systemId) nt(),void unparsedEntityDecl(String name, String publicId, String systemId, String notationName),接收注释声明事件的通知,接收未解析的实体声明事件的通知,EntityResolver接口,EntityResolver接口是用于解析实体的基本接口,该接口位于org.xml.sax包中。,该接口只有一个方法,如下:,public InputSource resolveEntity(String publicId, String systemId),允许应用程序解析外部实体。并返回一个InputSource类的对象或者为null,用于读取实体信息,解析器将在打开任何外部实体前调用此方法。此类实体包括在DTD内引用的外部DTD子集和外部参数实体和在文档元素内引用的外部通用实体等。如果SAX应用程序需要实现自定义处理外部实体,则必须实现此接口。,ErrorHandler接口,ErrorHandler接口是SAX错误处理程序的基本接口。如果SAX应用程序需要实现自定义的错误处理,则它必须实现此接口,然后解析器将通过此接口报告所有的错误和警告。,该接口的方法如下:,void error(SAXParseException exception),void fatalError(SAXParseException exception),接收可恢复的错误通知,接收不可恢复的错误通知,void warning(SAXParseException exception),接收警告的通知,SAX的其他类和接口介绍,XMLReaderFactory类,XMLReaderFactory是一个final类,创建XML解析器的工厂类。,该类包含两个静态方法,如下:,static XMLReader createXMLReader(),static XMLReader createXMLReader(String className),尝试从系统默认值创建一个XMLReader,尝试从类名称className创建一个XMLReader,类名称className必须可以被实例化为一个XML解析器。一般为 “org.apache.xerces.parsers.SAXParser”类。,DefaultHandler类,DefaultHandler类是SAX2事件处理程序的默认基类。它继承了EntityResolver、DTDHandler、ContentHandler和ErrorHandler这四个接口。包含这四个接口的所有方法,所以我们在编写事件处理程序时,可以不用直接实现这四个接口,而继承该类,然后重写我们需要的方法。如下:,import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; public class TestDefaultHandler extends DefaultHandler public void startDocument() throws SAXException System.out.println(“开始解析!“); public void endDocument() throws SAXException System.out.println(“解析完成!“); public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException System.out.println(“元素名:“+qName); public void endElement(String uri, String localName, String qName) throws SAXException System.out.println(“对“+qName+“的解析完成!“); ,XMLReader接口,XMLReader接口是使用回调读取XML文档的接口。XMLReader是XML解析器的SAX2驱动程序必须实现的接口。此接口允许应用程序设置和查询解析器中的功能和属性,注册文档的事件处理程序,以及对文档的解析。如下:,import org.xml.sax.*; import org.xml.sax.helpers.*; public class TestXMLReader public TestXMLReader() try XMLReader reader = XMLReaderFactory.createXMLReader( “org.apache.xerces.parsers.SAXParser“); System.out.println(“创建解析器成功!“); /MyContentHandler是实现

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论