`
chris_freedream
  • 浏览: 32928 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

SAX解析XML file 介绍2

阅读更多
  • 1. Overview
  • 2. How to use DefaultHandler
  • 3. Focus on namespace

1. Overview
在第一篇文章介绍到SAX的基本用法,并且通过范例实现了一个简单的解析程序,其中实现了ContentHandler, ErrorHandler, 在coding的时候,你会发现很多方法我们根本就没有做任何处理,直接是个空实现,这对于造成了代码的冗余,别担心DefaultHandler已经帮我们做了这部份工作,我们只需要直接extends DefaultHandler就Okay了, 当然假如我们的class已经extends了另外一个类了,这样我们是不是只能束手就擒了呢?No! 我们可以使用组合的方式将DefaultHandler给组合进来, 如: setSAXHandler( ContentHandler defaultHandler ), 这样你就可以把你对DefaultHandler的实现给灵活的组合进来,同时也提高到了代码的灵活性及可扩展性; 另外本篇中将简要的介绍另外一个重要话题namespace。
2. How to use DefaultHandler
DefaultHandler其实就是对接口ContentHandler, ErrorHandler等的一种适配,其中待解析的XML如下:
<?xml version="1.0" encoding="utf-8"?>
<S:books xmlns:S="http://www.w3.org/2003/05/soap-envelope" xmlns:ns3="http://www.w3.org/2003/05/soap-envelope">
	<ns3:book pages="1000" price="$99">
		<name>Thinking in java</name>
		<version>3.0</version>
	</ns3:book>
	<ns3:book pages="800" price="$40">
		<name>JUnit in Action</name>
		<version>2.0</version>
	</ns3:book>
	<ns3:book pages="900" price="$70">
		<name>Lucene in Action</name>
		<version>2.0</version>
	</ns3:book>
</S:books>

根据上面的XML文件,我们可以了解到,这里使用了S,ns3分别作books, book的前缀,所以如果单纯的输出localName, 则只有少了prefix的节点名称, 所以我们可以输出name(prefix:localName), 这样就可以得到全称了, 当然这里还牵涉到uri, 其中http://www.w3.org/2003/05/soap-envelope即为S的uri.解析代码如下:
package com.chris.sax.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintStream;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

public class XMLParser2 extends DefaultHandler
{
	
	protected  PrintStream output = System.out;
	protected PrintStream error = System.err;
   public void parserXMLFile( String fileName ) throws SAXException, IOException
   {
   	XMLReader reader = XMLReaderFactory.createXMLReader();
   	reader.setContentHandler( this );
   	reader.setErrorHandler( this );
   	InputSource source = new InputSource( new FileInputStream( new File( fileName ) ) );
   	reader.parse(source);
   }
   @Override
   public void startElement( String uri, String localName, String name,
   									Attributes attributes ) throws SAXException
   {
		output.append("<" +name );			
		for( int i = 0; i < attributes.getLength(); i++ )
		{
			String attrName = attributes.getQName( i );
			String attrValue = attributes.getValue( i );
			output.append(" " + attrName + "=" + attrValue );
		}
		output.append(">");
   }
   @Override
   public void endElement( String uri, String localName, String name )
   		throws SAXException
   {   	
   	output.println( "</" + name + ">" );
   }
   @Override
   public void characters( char[] ch, int start, int length )
   		throws SAXException
   {
   	
   	output.append( new String(ch, start, length ) );
   }
   @Override
   public void startDocument() throws SAXException
   {   	
   	output.println("<xml version=\"1.0\" encoding=\"utf-8\"?>");
   }
   public static void main( String[] args ) throws SAXException, IOException
	{
		XMLParser2 parser = new XMLParser2();
		parser.parserXMLFile("books2.xml");
	}
}

瞧这些代码,比起先前([url]SAX解析XML file 介绍[/url])那段实现简单清晰多了, 我们override 我们关心的Methods就Okay了。
代码运行结果如下:
<xml version="1.0" encoding="utf-8"?>
<S:books>
	<ns3:book pages=1000 price=$99>
		<name>Thinking in java</name>

		<version>3.0</version>

	</ns3:book>

	<ns3:book pages=800 price=$40>
		<name>JUnit in Action</name>

		<version>2.0</version>

	</ns3:book>

	<ns3:book pages=900 price=$70>
		<name>Lucene in Action</name>

		<version>2.0</version>

	</ns3:book>

</S:books>

3. Focus on namespace
假如你要对你的nanmespace作特殊的处理,比如换掉其中的前缀,修改uri等,那么你可以override startPrefixMapping and endPrefixMapping来一起配合完成你要的效果。
分享到:
评论

相关推荐

    SAX2方法读取XML文件

    SAX2方法读取XML文件,内容非常详实 (read XML file through SAX2 method, and it is in details.)

    sax解析util

    简单的sax解析方式 更灵活的使用 String result = ""; try { String filename = "students.xml"; URL url = Configuration.class.getClassLoader().getResource(filename); String str = url.getFile(); ...

    DIXML v5.9.0 for D6-XE10.1 XML XSLT EXSLT 解析

    It is build on the libxml2, libxslt and libexslt libraries but requires no DLLs nor other external files. DIXml is the most feature-complete XML and XSLT solution for Delphi. Features: XML and ...

    Android实现向本地写入一个XML文件和解析XML文件

    在网络存储过程中有很多时候会遇到XML文件解析和使用XML保存一些信息,解析XML文件用的比较多的方法是pull解析和SAX解析,但是我一般只用pull解析,下面就向cd卡写入一个XML文件,然后再使用pull解析的方法对文件...

    xml入门教程/xml入门教程

    2.xml文件是由元素和元素的内容以及属性组成的,一个xml文件中只能有一个根元素,标签和标签的内容加在一起叫作一个元素。xml是大小写 敏感的,只能以字母或下划线开头。 字符转义 &lt; 代表 ", &gt; 代表 "&gt;" , &...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    3.3.6 使用sax解析xml文档实例 74 3.4 jdom 83 3.4.1 下载并配置jdom 83 3.4.2 jdom api介绍 84 3.5 dom4j 88 3.5.1 下载并配置dom4j 88 3.5.2 dom4j api介绍 88 3.5.3 第一个实例 92 3.5.4 第二个实例 94 ...

    XMLParser:使用 SAX 验证处理来自 XML 文件的客户和订单统计信息

    XML解析器 使用 SAX 验证处理来自 XML 文件的客户和订单统计信息

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    3.3.6 使用sax解析xml文档实例 74 3.4 jdom 83 3.4.1 下载并配置jdom 83 3.4.2 jdom api介绍 84 3.5 dom4j 88 3.5.1 下载并配置dom4j 88 3.5.2 dom4j api介绍 88 3.5.3 第一个实例 92 3.5.4 第二个实例 94 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    3.3.6 使用sax解析xml文档实例 74 3.4 jdom 83 3.4.1 下载并配置jdom 83 3.4.2 jdom api介绍 84 3.5 dom4j 88 3.5.1 下载并配置dom4j 88 3.5.2 dom4j api介绍 88 3.5.3 第一个实例 92 3.5.4 第二个实例 94 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    3.3.6 使用sax解析xml文档实例 74 3.4 jdom 83 3.4.1 下载并配置jdom 83 3.4.2 jdom api介绍 84 3.5 dom4j 88 3.5.1 下载并配置dom4j 88 3.5.2 dom4j api介绍 88 3.5.3 第一个实例 92 3.5.4 第二个实例 94 ...

    Android代码-android-manifest-parser

    一个纯Java、实现了SAX接口、无任何第三方依赖的 AndroidManifest.xml 解析工具。 AndroidManifest.xml文件格式 Binary AndroidManifest.xml Magic Number(0x00080003) 4bytes // 魔数 File Size 4bytes // 文件...

    O r a c l e与X M L

    第2章介绍了Oracle的XML开发包(XML Developer's Kit,XDK)组件,回顾了Java/C/C++/ PLSQL等语言的XML解析器及XSLT处理程序、Java/C++语言的类生成器、以及Java TransViewer组件。用于访问及处理XML/XSL文件的可工作...

    kochanparser:我的学校 HTML 时间表的解析器

    除了糟糕的 SAX 解析器实现之外,您可能没有从中得到任何有用的信息。如何使用 File file = new File &#40; " o15.html " &#41;;String xml = file . toString ();TimeTable table = new TimeTable ();table . ...

    老罗android开发视频教程全集百度网盘下载

    【第一版第四章】老罗Android开发视频--解析XML数据(3集) 【第一版第五章】老罗Android开发视频--解析JSON数据(4集) 【第一版第六章】老罗Android开发视频--服务器端JDBC编程(2集) 【第一版第七章】老罗...

    dom4j-jdom封装和解析例子

    * Dom4j(SAX)读取xml数据(解析) * @param params * @throws Exception */ private static List&lt;Pois&gt; getReaderXml(String flg) throws Exception{ String fromRead=Dom4jTest2.class.getClassLoader...

    JDK_1_6 API

    javax.xml.transform.sax 此包实现特定于 SAX2 的转换 API。 javax.xml.transform.stax 提供特定于 StAX 的转换 API。 javax.xml.transform.stream 此包实现特定于流和 URI 的转换 API。 javax.xml.validation 此包...

    ruby_rnv:用于Ruby的RelaxNG Compact语法验证器

    结果与Nokogiri SAX解析器集成在一起,可提供高级Ruby。 用法 require 'rnv' validator = RNV :: Validator . new validator . load_schema_from_file &#40; "test/fixtures/test330.rnc" &#41; validator . parse_...

    node_domdocument

    基于出色的 SAX 解析器 expat,由 node-expat 项目为 Node.js 提供,DOMDocument 具有坚实且非常快速的基础。 ##如何使用 var DOMDocument = require ( './path/to/domdocument' ) ; // sorry for not yet ...

    JavaDemo:java中用到的技术分享demo

    JavaDemo java中用到的技术分享demo #java中解析XML的3中方式 SAX\DOM\StAX 代码位置:com.zdnuist.xmlparse 解析文件位置:file/x1.xml

    EnToCh:英语译成汉语

    EnToCh英语译成汉语1.词典是file目录下的xml文件;2.使用SAX解析;3.先把解析结果放在Treemap中,并序列化4.以后翻译的时候就可以直接从序列化文件读出结果

Global site tag (gtag.js) - Google Analytics