您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 人事档案/员工关系 > xml的四种解析方法及源代码
xml的四种解析方法及源代码(SAX、DOM、JDOM、DOM4J)第一种:SAX解析SAX处理机制:SAX是一种基于事件驱动的API。利用SAX解析XML文档,牵涉到两个部分:解析器和事件处理器。解析器负责读取XML文档,并向事件处理器发生事件,如元素开始和元素结束事件;而事件处理器则负责对事件做出响应,对传递的XML数据进行处理。测试用的xml文件:db.xmlXml代码?xmlversion=1.0encoding=UTF-8?!--!DOCTYPEdbconfigSYSTEMdb.dtd--dbconfigdbtype=oracledriveroracle.jdbc.driver.OracleDriver/driverurljdbc:oracle:thin:@localhost:1521:oracle/urluserscott/userpasswordtiger/password/db/dbconfig?xmlversion=1.0encoding=UTF-8?!--!DOCTYPEdbconfigSYSTEMdb.dtd--dbconfigdbtype=oracledriveroracle.jdbc.driver.OracleDriver/driverurljdbc:oracle:thin:@localhost:1521:oracle/urluserscott/userpasswordtiger/password/db/dbconfigDTD文件db.dtdXml代码!ELEMENTdbconfig(db+)!ELEMENTdb(driver,url,user,password)!ELEMENTdriver(#PCDATA)!ELEMENTurl(#PCDATA)!ELEMENTuser(#PCDATA)!ELEMENTpassword(#PCDATA)!ATTLISTdbtypeCDATA#REQUIRED!ELEMENTdbconfig(db+)!ELEMENTdb(driver,url,user,password)!ELEMENTdriver(#PCDATA)!ELEMENTurl(#PCDATA)!ELEMENTuser(#PCDATA)!ELEMENTpassword(#PCDATA)!ATTLISTdbtypeCDATA#REQUIREDSAX解析实例一org.xml.sax.DefalutHandler类:可以扩展该类,给出自己的解析实现SAXPrinter.javaJava代码importjava.io.File;importjavax.xml.parsers.SAXParser;importjavax.xml.parsers.SAXParserFactory;importorg.xml.sax.Attributes;importorg.xml.sax.SAXException;importorg.xml.sax.helpers.DefaultHandler;publicclassSAXPrinterextendsDefaultHandler{/***//***文档开始事件*/publicvoidstartDocument()throwsSAXException{System.out.println(?xmlversion=\1.0\encoding=\utf-8\?);}/***//***接收处理指令事件*/publicvoidprocessingInstruction(Stringtarget,Stringdata)throwsSAXException{System.out.println(?+target++data+?);}/***//***元素开始事件*参数说明:*uri-名称空间URI,如果元素没有任何名称空间URI,或者没有正在执行名称空间处理,则为空字符串。*localName-本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。*qName-限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。*attributes-附加到元素的属性。如果没有属性,则它将是空的Attributes对象。*/publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattrs)throwsSAXException{System.out.print(+qName);//输出元素名称intlen=attrs.getLength();//元素属性列表长度//利用循环输出属性列表for(inti=0;ilen;i++){System.out.print();System.out.print(attrs.getQName(i));System.out.print(=\);System.out.print(attrs.getValue(i));System.out.print(\);}System.out.print();}/***//***元素中字符数据事件:接收元素中字符数据*注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外)*2.有些解析器将使用ignorableWhitespace()方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器*/publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{System.out.print(newString(ch,start,length));}/***//***结束元素事件*/publicvoidendElement(Stringuri,StringlocalName,StringqName)throwsSAXException{System.out.print(/+qName+);}publicstaticvoidmain(String[]args){SAXParserFactoryspf=SAXParserFactory.newInstance();try{SAXParsersp=spf.newSAXParser();sp.parse(newFile(db.xml),newSAXPrinter());}catch(Exceptione){e.printStackTrace();}}}importjava.io.File;importjavax.xml.parsers.SAXParser;importjavax.xml.parsers.SAXParserFactory;importorg.xml.sax.Attributes;importorg.xml.sax.SAXException;importorg.xml.sax.helpers.DefaultHandler;publicclassSAXPrinterextendsDefaultHandler{/***//***文档开始事件*/publicvoidstartDocument()throwsSAXException{System.out.println(?xmlversion=\1.0\encoding=\utf-8\?);}/***//***接收处理指令事件*/publicvoidprocessingInstruction(Stringtarget,Stringdata)throwsSAXException{System.out.println(?+target++data+?);}/***//***元素开始事件*参数说明:*uri-名称空间URI,如果元素没有任何名称空间URI,或者没有正在执行名称空间处理,则为空字符串。*localName-本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。*qName-限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。*attributes-附加到元素的属性。如果没有属性,则它将是空的Attributes对象。*/publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattrs)throwsSAXException{System.out.print(+qName);//输出元素名称intlen=attrs.getLength();//元素属性列表长度//利用循环输出属性列表for(inti=0;ilen;i++){System.out.print();System.out.print(attrs.getQName(i));System.out.print(=\);System.out.print(attrs.getValue(i));System.out.print(\);}System.out.print();}/***//***元素中字符数据事件:接收元素中字符数据*注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外)*2.有些解析器将使用ignorableWhitespace()方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器*/publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{System.out.print(newString(ch,start,length));}/***//***结束元素事件*/publicvoidendElement(Stringuri,StringlocalName,StringqName)throwsSAXException{System.out.print(/+qName+);}publicstaticvoidmain(String[]args){SAXParserFactoryspf=SAXParserFactory.newInstance();try{SAXParsersp=spf.newSAXParser();sp.parse(newFile(db.xml),newSAXPrinter());}catch(Exceptione){e.printStackTrace();}}}SAX解析实例二org.xml.sax.ContentHandler接口:通过实现该接口给出自己的解析实现。org.xml.sax.ErrorHandler接口:如果SAX应用程序需要实现定制的错误处理,那么它必须实现这个接口,并调用XMLReader对象的setErrorHandler()方法向解析器注册异常处理实例,这样,解析器将通过这个接口报告所有的错误和警告。ContentHandlerImpl.javaJava代码importorg.xml.sax.Attributes;importorg.xml.sax.ContentHandler;importorg.xml.sax.Locator;importorg.xml.sax.SAXException;publicclassContentHandlerImplimplementsContentHandler{/***//***文档开始事件*/publicvoidstartDocument()throwsSAXException{System.out.println(?xmlversion=\1.0\encoding=\utf-8\?);}/***//***接收处理指令事件*/publicvoidprocessingInstruction
本文标题:xml的四种解析方法及源代码
链接地址:https://www.777doc.com/doc-3378465 .html