XML解析经典方法.docx_第1页
XML解析经典方法.docx_第2页
XML解析经典方法.docx_第3页
XML解析经典方法.docx_第4页
XML解析经典方法.docx_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

xml的四种解析方法及源代码(SAX、DOM、JDOM、DOM4J)第一种:SAX解析 SAX处理机制:SAX是一种基于事件驱动的API。利用SAX解析XML文档,牵涉到两个部分:解析器和事件处理器。解析器负责读取XML文档,并向事件处理器发生事件,如元素开始和元素结束事件;而事件处理器则负责对事件做出响应,对传递的XML数据进行处理。测试用的xml文件:db.xmlXml代码 !-oracle.jdbc.driver.OracleDriverjdbc:oracle:thin:localhost:1521:oraclescotttiger!- oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:localhost:1521:oracle scott tiger DTD文件db.dtdXml代码 SAX解析实例一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(); /*/* *接收处理指令事件 */publicvoidprocessingInstruction(Stringtarget,Stringdata)throwsSAXException System.out.println(); /*/* *元素开始事件 *参数说明: *uri-名称空间URI,如果元素没有任何名称空间URI,或者没有正在执行名称空间处理,则为空字符串。 *localName-本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。 *qName-限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。 *attributes-附加到元素的属性。如果没有属性,则它将是空的Attributes对象。 */publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattrs)throwsSAXException System.out.print(+qName);/输出元素名称 intlen=attrs.getLength();/元素属性列表长度 /利用循环输出属性列表 for(inti=0;i); /*/* *元素中字符数据事件:接收元素中字符数据 *注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外) *2.有些解析器将使用ignorableWhitespace()方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器 */publicvoidcharacters(charch,intstart,intlength)throwsSAXException System.out.print(newString(ch,start,length); /*/* *结束元素事件 */publicvoidendElement(Stringuri,StringlocalName,StringqName)throwsSAXException System.out.print(); publicstaticvoidmain(Stringargs) SAXParserFactoryspf=SAXParserFactory.newInstance(); try SAXParsersp=spf.newSAXParser(); sp.parse(newFile(db.xml),newSAXPrinter(); catch(Exceptione) e.printStackTrace(); 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(); /* */* * 接收处理指令事件 */ public void processingInstruction(String target, String data) throws SAXException System.out.println(); /* */* * 元素开始事件 * 参数说明: * 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); /* */* * 元素中字符数据事件:接收元素中字符数据 * 注意: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 qName) throws SAXException System.out.print(); 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代码 importorg.xml.sax.Attributes; importorg.xml.sax.ContentHandler; importorg.xml.sax.Locator; importorg.xml.sax.SAXException; publicclassContentHandlerImplimplementsContentHandler /*/* *文档开始事件 */publicvoidstartDocument()throwsSAXException System.out.println(); /*/* *接收处理指令事件 */publicvoidprocessingInstruction(Stringtarget,Stringdata)throwsSAXException System.out.println(); /*/* *元素开始事件 *参数说明: *uri-名称空间URI,如果元素没有任何名称空间URI,或者没有正在执行名称空间处理,则为空字符串。 *localName-本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。 *qName-限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。 *attributes-附加到元素的属性。如果没有属性,则它将是空的Attributes对象。 */publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattrs)throwsSAXException System.out.print(+qName);/输出元素名称 intlen=attrs.getLength();/元素属性列表长度 /利用循环输出属性列表 for(inti=0;i); /*/* *元素中字符数据事件:接收元素中字符数据 *注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外) *2.有些解析器将使用ignorableWhitespace()方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器 */publicvoidcharacters(charch,intstart,intlength)throwsSAXException System.out.print(newString(ch,start,length); /*/* *结束元素事件 */publicvoidendElement(Stringuri,StringlocalName,StringqName)throwsSAXException System.out.print(); publicvoidendDocument()throwsSAXException publicvoidendPrefixMapping(Stringprefix)throwsSAXException publicvoidignorableWhitespace(charch,intstart,intlength)throwsSAXException publicvoidsetDocumentLocator(Locatorlocator) publicvoidskippedEntity(Stringname)throwsSAXException publicvoidstartPrefixMapping(Stringprefix,Stringuri)throwsSAXException 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(); /* */* * 接收处理指令事件 */ public void processingInstruction(String target, String data) throws SAXException System.out.println(); /* */* * 元素开始事件 * 参数说明: * 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); /* */* * 元素中字符数据事件:接收元素中字符数据 * 注意: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 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 setDocumentLocator(Locator locator) public void skippedEntity(String name) throws SAXException public void startPrefixMapping(String prefix, String uri) throws SAXException ErrorHandlerImpl.java Java代码 publicclassErrorHandlerImplimplementsErrorHandler publicvoidwarning(SAXParseExceptione)throwsSAXException System.out.println(Warning+getLocationString(e)+:+e.getMessage(); publicvoiderror(SAXParseExceptione)throwsSAXException System.out.println(Error+getLocationString(e)+:+e.getMessage(); publicvoidfatalError(SAXParseExceptione)throwsSAXException System.out.println(FatalError+getLocationString(e)+:+e.getMessage(); privateStringgetLocationString(SAXParseExceptione) StringBuffersb=newStringBuffer(); StringpublicId=e.getPublicId(); if(publicId!=null) sb.append(publicId); sb.append(); StringsystemId=e.getSystemId(); if(systemId!=null) sb.append(systemId); sb.append(); sb.append(e.getLineNumber(); sb.append(:); sb.append(e.getColumnNumber(); returnsb.toString(); 1. public class ErrorHandlerImpl 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 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(); SaxParserTest.java Java代码 importjava.io.FileInputStream; importorg.xml.sax.InputSource; importorg.xml.sax.XMLReader; importorg.xml.sax.helpers.XMLReaderFactory; publicclassSaxParserTest publicstaticvoidmain(Stringargs) try XMLReaderxmlReader=XMLReaderFactory.createXMLReader(); /关闭或打开验证 xmlReader.setFeature(/sax/features/validation,true); /注册事件处理器 xmlReader.setContentHandler(newContentHandlerImpl(); /注册异常处理器 xmlReader.setErrorHandler(newErrorHandlerImpl(); xmlReader.parse(newInputSource(newFileInputStream(saxdb.xml); catch(Exceptione) 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=XMLReaderFactory.createXMLReader(); /关闭或打开验证 xmlReader.setFeature(/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中的核心概念就是节点。DOM在分析XML文档时,将将组成XML文档的各个部分(元素、属性、文本、注释、处理指令等)映射为一个对象(节点)。在内存中,这些节点形成一课文档树。整棵树是一个节点,树中的每一个节点也是一棵树(子树),可以说,DOM就是对这棵树的一个对象描述,我们通过访问树中的节点来存取XML文档的内容。PS:属性节点是附属于元素的,不能被看做是元素的子节点,更不能作为一个单独的节点DOMPrinter.javaJava代码 importorg.w3c.dom.Document; importorg.w3c.dom.NamedNodeMap; importorg.w3c.dom.Node; ernal.parsers.DOMParser; publicclassDOMPrinter publicstaticvoidmain(Stringargs) try /*/*获取Document对象*/DOMParserparser=newDOMParser(); parser.parse(db.xml); Documentdocument=parser.getDocument(); printNode(document); catch(Exceptione) e.printStackTrace(); publicstaticvoidprintNode(Nodenode) shortnodeType=node.getNodeType(); switch(nodeType) caseNode.PROCESSING_INSTRUCTION_NODE:/预处理指令类型 printNodeInfo(node); break; caseNode.ELEMENT_NODE:/元素节点类型 printNodeInfo(node); printAttribute(node); break; caseNode.TEXT_NODE:/文本节点类型 printNodeInfo(node); break; default: break; Nodechild=node.getFirstChild(); while(child!=null) printNode(child); child=child.getNextSibling(); /*/* *根据节点类型打印节点 *paramnode */publicstaticvoidprintNodeInfo(Nodenode) if(node.getNodeType()=Node.ELEMENT_NODE) System.out.println(NodeName:+node.getNodeName(); elseif(node.getNodeType()=Node.TEXT_NODE) Stringvalue=node.getNodeValue().trim(); if(!value.equals() System.out.println(NodeValue:+value); elseSystem.out.println(); else System.out.println(node.getNodeName()+:+node.getNodeValue(); /*/* *打印节点属性 *paramaNode节点 */publicstaticvoidprintAttribute(NodeaNode) NamedNodeMapattrs=aNode.getAttributes(); if(attrs!=null) for(inti=0;iattrs.getLength();i+) NodeattNode=attrs.item(i); System.out.println(Attribute:+attNode.getNodeName()+=+attNode.getNodeValue()+); import org.w3c.dom.Document;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.Node;import ernal.parsers.DOMParser;public class DOMPrinter public static void main(String args) try /* */* 获取Document对象 */ DOMParser parser = new DOMParser(); parser.parse(db.xml); Document document = parser.getDocument(); printNode(document); catch (Exception e) e.printStackTrace(); pu

温馨提示

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

评论

0/150

提交评论