当前位置:文档之家› xml的四种解析方法及源代码

xml的四种解析方法及源代码

xml的四种解析方法及源代码(SAX、DOM、JDOM、DOM4J)第一种:SAX解析SAX处理机制:SAX是一种基于事件驱动的API。

利用SAX解析XML文档,牵涉到两个部分:解析器和事件处理器。

解析器负责读取XML文档,并向事件处理器发生事件,如元素开始和元素结束事件;而事件处理器则负责对事件做出响应,对传递的XML数据进行处理。

测试用的xml文件:db.xmlXml代码<?xml version="1.0"encoding="UTF-8"?><!--<!DOCTYPE dbconfig SYSTEM "db.dtd">--><dbconfig><db type="oracle"><driver>oracle.jdbc.driver.OracleDriver</driver><url>jdbc:oracle:thin:@localhost:1521:oracle</url><user>scott</user><password>tiger</password></db></dbconfig>DTD文件db.dtdXml代码<!ELEMENT dbconfig (db+)><!ELEMENT db (driver,url,user,password)><!ELEMENT driver (#PCDATA)><!ELEMENT url (#PCDATA)><!ELEMENT user (#PCDATA)><!ELEMENT password (#PCDATA)><!ATTLIST db type CDATA #REQUIRED>SAX解析实例一org.xml.sax.DefalutHandler类: 可以扩展该类,给出自己的解析实现SAXPrinter.javaJava代码import java.io.File;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class SAXPrinter extends DefaultHandler{/** *//*** 文档开始事件*/public void startDocument() throws SAXException{System.out.println("<?xml version=\"1.0\" encoding=\"utf-8 \"?>");}/** *//*** 接收处理指令事件*/public void processingInstruction(String target, String data) throws SAXException{System.out.println("<?"+target+" "+data+"?>");}/** *//*** 元素开始事件* 参数说明:* uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。

* localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。

* qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。

* attributes - 附加到元素的属性。

如果没有属性,则它将是空的 Attributes 对象。

*/public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException{System.out.print("<"+qName);//输出元素名称int len=attrs.getLength();//元素属性列表长度//利用循环输出属性列表for(int i=0;i<len;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()方法,如:进行有效性验证的解析器*/public void characters(char[] ch, int start, int length) throw s SAXException{System.out.print(new String(ch,start,length));}/** *//*** 结束元素事件*/public void endElement(String uri, String localName, String qN ame) throws SAXException{System.out.print("</"+qName+">");}public static void main(String[] args){SAXParserFactory spf=SAXParserFactory.newInstance();try{SAXParser sp=spf.newSAXParser();sp.parse(new File("db.xml"),new SAXPrinter());}catch (Exception e){e.printStackTrace();}}}SAX解析实例二org.xml.sax.ContentHandler接口: 通过实现该接口给出自己的解析实现。

org.xml.sax.ErrorHandler接口:如果SAX应用程序需要实现定制的错误处理,那么它必须实现这个接口,并调用XMLReader对象的setErrorHandler()方法向解析器注册异常处理实例,这样,解析器将通过这个接口报告所有的错误和警告。

ContentHandlerImpl.javaJava代码import org.xml.sax.Attributes;import org.xml.sax.ContentHandler;import org.xml.sax.Locator;import org.xml.sax.SAXException;public class ContentHandlerImpl implements ContentHandler{/** *//*** 文档开始事件*/public void startDocument() throws SAXException{System.out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?> ");}/** *//*** 接收处理指令事件*/public void processingInstruction(String target, String data) th rows SAXException{System.out.println("<?"+target+" "+data+"?>");}/** *//*** 元素开始事件* 参数说明:* uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。

* localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。

* qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。

* attributes - 附加到元素的属性。

如果没有属性,则它将是空的 Attributes 对象。

*/public void startElement(String uri, String localName, String qN ame, Attributes attrs) throws SAXException{System.out.print("<"+qName);//输出元素名称int len=attrs.getLength();//元素属性列表长度//利用循环输出属性列表for(int i=0;i<len;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()方法,如:进行有效性验证的解析器*/public void characters(char[] ch, int start, int length) throws SAXException{System.out.print(new String(ch,start,length));}/** *//*** 结束元素事件*/public void endElement(String uri, String localName, String qNam e) throws SAXException{System.out.print("</"+qName+">");}public void endDocument() throws SAXException{}public void endPrefixMapping(String prefix) throws SAXException {}public void ignorableWhitespace(char[] ch, int start, int length ) throws SAXException{}public void setDocumentLocator(Locator locator){}public void skippedEntity(String name) throws SAXException {}public void startPrefixMapping(String prefix, String uri) throws SAXException{}}ErrorHandlerImpl.javaJava代码public class ErrorHandlerImpl implements ErrorHandler{public void warning(SAXParseException e) throws SAXException{System.out.println("[Warning ]"+getLocationString(e)+":"+e.get Message());}public void error(SAXParseException e) throws SAXException{System.out.println("[Error ]"+getLocationString(e)+":"+e.getMe ssage());}public void fatalError(SAXParseException e) throws SAXException {System.out.println("[Fatal Error ]"+getLocationString(e)+":"+e .getMessage());}private String getLocationString(SAXParseException e){StringBuffer sb=new StringBuffer();String publicId=e.getPublicId();if(publicId!=null){sb.append(publicId);sb.append(" ");}String systemId=e.getSystemId();if(systemId!=null){sb.append(systemId);sb.append(" ");}sb.append(e.getLineNumber());sb.append(":");sb.append(e.getColumnNumber());return sb.toString();}1.}SaxParserTest.javaJava代码import java.io.FileInputStream;import org.xml.sax.InputSource;import org.xml.sax.XMLReader;import org.xml.sax.helpers.XMLReaderFactory;public class SaxParserTest{public static void main(String[] args){try{XMLReader xmlReader=XMLReaderFactory.createXMLReader();//关闭或打开验证xmlReader.setFeature("/sax/features/validation ",true);//注册事件处理器xmlReader.setContentHandler(new ContentHandlerImpl());//注册异常处理器xmlReader.setErrorHandler(new ErrorHandlerImpl());xmlReader.parse(new InputSource(new FileInputStream("saxdb.x ml")));} catch (Exception e){System.out.println(e.getMessage());}}}第二种:DOM解析DOM中的核心概念就是节点。

相关主题