《xml的四种解析方法及源代码.docx》由会员分享,可在线阅读,更多相关《xml的四种解析方法及源代码.docx(37页珍藏版)》请在三一办公上搜索。
1、xml的四种解析方法及源代码xml的四种解析方法及源代码(SAX、DOM、JDOM、DOM4J) 第一种:SAX解析 SAX处理机制:SAX是一种基于事件驱动的API。利用SAX解析XML文档,牵涉到两个部分:解析器和事件处理器。解析器负责读取XML文档,并向事件处理器发生事件,如元素开始和元素结束事件;而事件处理器则负责对事件做出响应,对传递的XML数据进行处理。 测试用的xml文件:db.xml Xml代码 !- oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:localhost:1521:oracle scott tiger !- ora
2、cle.jdbc.driver.OracleDriver jdbc:oracle:thin:localhost:1521:oracle scott tiger DTD文件db.dtd Xml代码 SAX解析实例一 org.xml.sax.DefalutHandler类: 可以扩展该类,给出自己的解析实现 SAXPrinter.java Java代码 import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attri
3、butes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SAXPrinter extends DefaultHandler /* */* * 文档开始事件 */ public void startDocument throws SAXException System.out.println(); /* */* * 接收处理指令事件 */ public void processingInstruction(String target, String data)
4、throws SAXException System.out.println(); /* */* * 元素开始事件 * 参数说明: * uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。 * localName - 本地名称,如果没有正在执行名称空间处理,则为空字符串。 * qName - 限定的名称,如果限定的名称不可用,则为空字符串。 * attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。 */ public void startElement(String uri, String
5、localName, String qName, Attributes attrs) throws SAXException System.out.print(+qName);/输出元素名称 int len=attrs.getLength;/元素属性列表长度 /利用循环输出属性列表 for(int i=0;i); /* */* * 元素中字符数据事件:接收元素中字符数据 * 注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外) * 2.有些解析器将使用ignorableWhitespace方法来报告元素内容中的空白,而不是characters方法,如:进行
6、有效性验证的解析器 */ 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 qName) throws SAXException System.out.print(); public static void main(String args) SAX
7、ParserFactory spf=SAXParserFactory.newInstance; try SAXParser sp=spf.newSAXParser; sp.parse(new File(db.xml),new SAXPrinter); catch (Exception e) e.printStackTrace; import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; impo
8、rt org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SAXPrinter extends DefaultHandler /* */* * 文档开始事件 */ public void startDocument throws SAXException System.out.println(); /* */* * 接收处理指令事件 */ public void processingInstruction(String target, String data) throws SAXE
9、xception System.out.println(); /* */* * 元素开始事件 * 参数说明: * uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。 * localName - 本地名称,如果没有正在执行名称空间处理,则为空字符串。 * qName - 限定的名称,如果限定的名称不可用,则为空字符串。 * attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。 */ public void startElement(String uri, String localName,
10、String qName, Attributes attrs) throws SAXException System.out.print(+qName);/输出元素名称 int len=attrs.getLength;/元素属性列表长度 /利用循环输出属性列表 for(int i=0;i); /* */* * 元素中字符数据事件:接收元素中字符数据 * 注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外) * 2.有些解析器将使用ignorableWhitespace方法来报告元素内容中的空白,而不是characters方法,如:进行有效性验证的解析器 *
11、/ 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 qName) throws SAXException System.out.print(); public static void main(String args) SAXParserFacto
12、ry 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对象的setErrorHandle
13、r方法向解析器注册异常处理实例,这样,解析器将通过这个接口报告所有的错误和警告。 ContentHandlerImpl.java Java代码 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 startDocumen
14、t throws SAXException System.out.println(); /* */* * 接收处理指令事件 */ public void processingInstruction(String target, String data) throws SAXException System.out.println(); /* */* * 元素开始事件 * 参数说明: * uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。 * localName - 本地名称,如果没有正在执行名称空间处理,则为空字符串。 * qName
15、- 限定的名称,如果限定的名称不可用,则为空字符串。 * 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); /* */* * 元素中字符数
16、据事件:接收元素中字符数据 * 注意: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 endEleme
17、nt(String uri, String localName, String qName) throws SAXException System.out.print(); 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 setDocume
18、ntLocator(Locator locator) public void skippedEntity(String name) throws SAXException public void startPrefixMapping(String prefix, String uri) throws SAXException import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; public cl
19、ass ContentHandlerImpl implements ContentHandler /* */* * 文档开始事件 */ public void startDocument throws SAXException System.out.println(); /* */* * 接收处理指令事件 */ public void processingInstruction(String target, String data) throws SAXException System.out.println(); /* */* * 元素开始事件 * 参数说明: * uri - 名称空间 UR
20、I,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。 * localName - 本地名称,如果没有正在执行名称空间处理,则为空字符串。 * qName - 限定的名称,如果限定的名称不可用,则为空字符串。 * attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。 */ public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException System.out.print(+
21、qName);/输出元素名称 int len=attrs.getLength;/元素属性列表长度 /利用循环输出属性列表 for(int i=0;i); /* */* * 元素中字符数据事件:接收元素中字符数据 * 注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外) * 2.有些解析器将使用ignorableWhitespace方法来报告元素内容中的空白,而不是characters方法,如:进行有效性验证的解析器 */ public void characters(char ch, int start, int length) throws SAXExc
22、eption System.out.print(new String(ch,start,length); /* */* * 结束元素事件 */ public void endElement(String uri, String localName, String qName) throws SAXException System.out.print(); public void endDocument throws SAXException public void endPrefixMapping(String prefix) throws SAXException public void i
23、gnorableWhitespace(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.java Java代码 public class Er
24、rorHandlerImpl implements ErrorHandler public void warning(SAXParseException e) throws SAXException System.out.println(Warning +getLocationString(e)+:+e.getMessage); public void error(SAXParseException e) throws SAXException System.out.println(Error +getLocationString(e)+:+e.getMessage); public void
25、 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( ); Stri
26、ng 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. public class ErrorHandlerImpl implements ErrorHandler public void warning(SAXParseException e) throws SAXException System.ou
27、t.println(Warning +getLocationString(e)+:+e.getMessage); public void error(SAXParseException e) throws SAXException System.out.println(Error +getLocationString(e)+:+e.getMessage); public void fatalError(SAXParseException e) throws SAXException System.out.println(Fatal Error +getLocationString(e)+:+e
28、.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);
29、sb.append(:); sb.append(e.getColumnNumber); return sb.toString; SaxParserTest.java Java代码 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 XML
30、Reader xmlReader=XMLReaderFactory.createXMLReader; /关闭或打开验证 xmlReader.setFeature(http:/xml.org/sax/features/validation,true); /注册事件处理器 xmlReader.setContentHandler(new ContentHandlerImpl); /注册异常处理器 xmlReader.setErrorHandler(new ErrorHandlerImpl); xmlReader.parse(new InputSource(new FileInputStream(sa
31、xdb.xml); catch (Exception e) System.out.println(e.getMessage); 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=XMLReader
32、Factory.createXMLReader; /关闭或打开验证 xmlReader.setFeature(http:/xml.org/sax/features/validation,true); /注册事件处理器 xmlReader.setContentHandler(new ContentHandlerImpl); /注册异常处理器 xmlReader.setErrorHandler(new ErrorHandlerImpl); xmlReader.parse(new InputSource(new FileInputStream(saxdb.xml); catch (Exception e) System.out.println(e.getMessage); 第二种:DOM解析 DOM中的核心概念就是节点。D