`
wghjay
  • 浏览: 91235 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

xml的四种解析方法及源代码(SAX、DOM、JDOM、DOM4J) 上

    博客分类:
  • xml
阅读更多

第一种:SAX解析 SAX处理机制:SAX是一种基于事件驱动的API。利用SAX解析XML文档,牵涉到两个部分:解析器和事件处理器。解析器负责读取XML文档,并向事件处理器发生事件,如元素开始和元素结束事件;而事件处理器则负责对事件做出响应,对传递的XML数据进行处理。 测试用的xml文件:db.xml Xml代码 oracle.jdbc.driver.OracleDriverjdbc:oracle:thin:@localhost:1521:oraclescotttigeroracle.jdbc.driver.OracleDriverjdbc:oracle:thin:@localhost:1521:oraclescotttiger 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.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(""+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(""); } /** *//** * 元素中字符数据事件:接收元素中字符数据 * 注意: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(""+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(); } } } 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(""+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(""); } /** *//** * 元素中字符数据事件:接收元素中字符数据 * 注意: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(""+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.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 startDocument() throws SAXException { System.out.println(""); } /** *//** * 接收处理指令事件 */ 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(""); } /** *//** * 元素中字符数据事件:接收元素中字符数据 * 注意: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(""+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 { } } 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(""+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(""); } /** *//** * 元素中字符数据事件:接收元素中字符数据 * 注意: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(""+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.java Java代码 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(); } } 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代码 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("[url=http://xml.org/sax/features/validation",true]http://xml.org/sax/features/validation",true[/url]); //注册事件处理器 xmlReader.setContentHandler(new ContentHandlerImpl()); //注册异常处理器 xmlReader.setErrorHandler(new ErrorHandlerImpl()); xmlReader.parse(new InputSource(new FileInputStream("saxdb.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=XMLReaderFactory.createXMLReader(); //关闭或打开验证 xmlReader.setFeature("[url=http://xml.org/sax/features/validation",true]http://xml.org/sax/features/validation",true[/url]); //注册事件处理器 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.java Java代码 import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import com.sun.org.apache.xerces.internal.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(); } } public static void printNode(Node node) { short nodeType=node.getNodeType(); switch(nodeType) { case Node.PROCESSING_INSTRUCTION_NODE://预处理指令类型 printNodeInfo(node); break; case Node.ELEMENT_NODE://元素节点类型 printNodeInfo(node); printAttribute(node); break; case Node.TEXT_NODE://文本节点类型 printNodeInfo(node); break; default: break; } Node child=node.getFirstChild(); while(child!=null) { printNode(child); child=child.getNextSibling(); } } /** *//** * 根据节点类型打印节点 * @param node */ public static void printNodeInfo(Node node) { if (node.getNodeType() == Node.ELEMENT_NODE) { System.out.println("NodeName: " + node.getNodeName()); } else if (node.getNodeType() == Node.TEXT_NODE) { String value = node.getNodeValue().trim(); if (!value.equals("")) System.out.println("NodeValue: " + value); else System.out.println(); }else { System.out.println(node.getNodeName()+" : "+node.getNodeValue()); } } /** *//** * 打印节点属性 * @param aNode 节点 */ public static void printAttribute(Node aNode) { NamedNodeMap attrs = aNode.getAttributes(); if(attrs!=null) { for (int i = 0; i

分享到:
评论

相关推荐

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

    在Java中,处理XML文档通常有四种主要的解析方法:DOM(文档对象模型)、SAX(简单API对于XML)、JDOM(Java特定的DOM)以及DOM4J。每种解析方法都有自己的特点和适用场景,下面将详细介绍这些解析方法以及提供的...

    XML的四种解析方式比较

    在Java中,处理XML有四种主要的解析方式:DOM、SAX、DOM4J和JDOM。每种方法都有其特性和适用场景,下面将详细对比和介绍这四种解析方式。 1. DOM(Document Object Model) DOM是一种树形结构的API,它将整个XML...

    dom4j---xml解析jar包

    在Java环境中,解析XML文档时,我们通常会遇到各种库,其中DOM4J是一个非常流行的、功能强大的开放源代码库。这个库不仅简化了XML处理,还提供了XPath和XSLT的支持,使其成为Java开发者处理XML的首选工具之一。 **...

    dom4j-1.6.1-API+源代码-中文版.rar

    **DOM4J 1.6.1 API及源代码中文版详解** DOM4J是一个非常优秀的Java XML API,它提供了全面而强大的XML处理功能,包括读取、创建、修改和查询XML文档。这个压缩包“dom4j-1.6.1-API+源代码-中文版.rar”包含了DOM4J...

    dom4j源代码

    2. **SAX支持**:DOM4J也支持SAX(Simple API for XML),这是一种事件驱动的解析器,适用于处理大型XML文件,因为它不需要将整个文档加载到内存中。 3. **XPath支持**:DOM4J提供了对XPath的支持,XPath是一种在...

    xml四种解析.rar

    本资源“xml四种解析.rar”聚焦于XML的四种主要解析方法,其中包括DOM、SAX、StAX以及DOM4J和JDOM这两个Java库的使用。 1. DOM(Document Object Model)解析: DOM是W3C推荐的标准解析模型,它将整个XML文档加载到...

    jdom.jar与dom4j.jar包

    为了处理XML文档,开发者经常需要依赖特定的库,如JDOM和DOM4J。这两个库都是Java中常用的XML解析器,提供了不同的方法来读取、写入、操作和解析XML文档。下面将详细讨论这两个库及其在XML处理中的应用。 **JDOM** ...

    dom4j和jdom解析XML小例子

    本文将深入探讨如何使用dom4j和jdom两种流行的Java库来解析XML文档,并通过具体的代码示例来展示它们的应用。 ### DOM4J DOM4J(Document Object Model for Java)是一个开放源代码的Java API,用于处理XML文档。...

    java xml 解析 源代码

    在源代码中,你可以找到使用DOM和SAX解析XML的示例。通过阅读和运行这些代码,你将更好地理解它们的工作原理和使用场景。记得在实际操作时,确保XML文件的编码正确,并处理可能的异常情况,如文件不存在或格式错误。...

    dom4j jdom api jar

    DOM4J和JDOM是两种流行的Java XML处理库,它们为开发者提供了API来解析、创建、操作和遍历XML文档。这两个库都是基于Java的,旨在简化XML文档对象模型(DOM)的使用,同时提供更高效和灵活的处理方式。 **DOM4J** ...

    Dom4j_demo.rar_DEMO_dom4j de_dom4j demo_dom4j demo project_xml读

    此外,Dom4j还支持SAX和DOM解析器,以及JAXB和JDOM的接口,使其能够与多种XML处理技术兼容。 **XML读取操作** 在Java中使用Dom4j进行XML读取通常包括以下步骤: 1. 加载XML文档:通过`DocumentFactory`创建`...

    jdom.jar xml解析

    4. **Builder**:用于创建和解析XML文档的类,如`SAXBuilder`用于从XML源生成DOM结构,`DocumentBuilder`用于构建XML文档。 5. **BasicJDOMFactory**:提供默认的元素和属性创建方法。 **使用JDOM解析XML的步骤** ...

    jdom4j解析xml

    与标准的DOM和SAX相比,jdom4j提供了更高级别的抽象,使得开发者可以更加专注于业务逻辑而不是底层的XML处理细节。此外,jdom4j还支持XPath查询,使得查找和操作XML文档中的特定元素变得非常容易。 ### 总结 通过...

    xml四种解析方法,解析XML四种方法

    JDOM直接从XML源生成一个树模型,然后可以直接操作这个模型。 代码示例: ```java import org.jdom2.Document; import org.jdom2.input.SAXBuilder; import org.jdom2.output.Format; import org.jdom2.output....

    dom4j-2.1.1 jar和source.jar

    在Java世界中,DOM4J是与DOM、SAX和JDOM等其他XML处理库并驾齐驱的一个选择,尤其在XML的读写操作上,DOM4J提供了更简洁和直观的接口。 标题中的"dom4j-2.1.1.jar"是DOM4J库的二进制版本,包含了所有编译后的类和...

    Dom4J zip

    1. **XML解析**:Dom4J提供了多种解析XML的方式,包括DOM、SAX和StAX。它支持事件驱动的解析模型(SAX)和树型模型(DOM),使得开发者可以根据项目需求选择最适合的解析策略。 2. **XPath支持**:Dom4J内置了XPath...

    jdom文件解析源代码

    在本文中,我们将深入探讨JDOM的基本概念、如何读取和写入XML文件,并通过源代码分析来理解其工作原理。 1. JDOM基本概念: - DOM(Document Object Model)是W3C制定的一种标准,它定义了XML文档的结构和操作方法...

    Jdom解析XML

    通过JDOM,开发者可以使用Java API来处理XML文档,无需了解底层的SAX或DOM解析器的工作原理。 **JDOM的基本元素** - **Document**: XML文档的根节点,代表整个XML文档。 - **Element**: 表示XML文档中的元素,它是...

    dom4j所需要的包和依赖包

    - 源码包中包含DOM4J的全部源代码,可以学习其设计模式和实现细节。 - 开发者可以通过查看源码学习如何扩展DOM4J,创建自定义解析器或输出格式。 6. **与其他库的比较** - 相比于Java内置的DOM API,DOM4J更易于...

    dom4j的源文件(dom4j-1.6.1)含例子和jar包

    - **解析和生成 XML**: DOM4J 可以解析 XML 文件,创建 `Document` 对象,也可以将 `Document` 转换回 XML 字符串。 - **操作 XML 结构**: 添加、删除、修改元素、属性等。 - **事件处理**: 提供了基于 SAX 的...

Global site tag (gtag.js) - Google Analytics