`
balaschen
  • 浏览: 190187 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

利用sax和xslt转换csv文件内容

阅读更多
package jaxp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.DTDHandler;
import org.xml.sax.EntityResolver;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.AttributesImpl;

public class SAX_XSL {
	
	public static void main(String[] args) throws Exception{
		transform_by_saxsource();
		transform_by_saxtransformfactory();
	}


	private static void transform_by_saxtransformfactory() throws TransformerFactoryConfigurationError, TransformerConfigurationException, IOException, SAXException {
		TransformerFactory factory = TransformerFactory.newInstance();
		if(factory.getFeature(SAXTransformerFactory.FEATURE)){
			SAXTransformerFactory saxfactory = (SAXTransformerFactory) factory;
			TransformerHandler handler = saxfactory.newTransformerHandler(new StreamSource(loadxsl()));
			handler.setResult(new StreamResult(System.out));
			CSVParser parser = new CSVParser();
			parser.setContentHandler(handler);
			System.out.println("//------------华丽的分割线----------------//");
			parser.parse(new InputSource(loadcsv()));
		}
	}


	private static void transform_by_saxsource() throws TransformerFactoryConfigurationError, TransformerConfigurationException, TransformerException {
		TransformerFactory factory = TransformerFactory.newInstance();
		Templates templates=  factory.newTemplates(new StreamSource(loadxsl()));
		Transformer transformer = templates.newTransformer();
		
		Source source = new SAXSource(new CSVParser(),new InputSource(loadcsv()));
		Result result = new StreamResult(System.out);
		transformer.transform(source, result);
		
	}


	private static InputStream loadxsl() {
		InputStream xsl = SAX_XSL.class.getClassLoader().getResourceAsStream("jaxp/csv.xsl");
		return xsl;
	}
	
	private static InputStream loadcsv() {
		InputStream xsl = SAX_XSL.class.getClassLoader().getResourceAsStream("jaxp/book.csv");
		return xsl;
	}
	
	public static class CSVParser implements XMLReader {
		private static final Attributes EMPTY_ATTRS = new AttributesImpl();
		private static final String HTTP_XML_ORG_SAX_FEATURES_NAMESPACES="http://xml.org/sax/features/namespaces";
		private ContentHandler contentHandler;
		private DTDHandler dtdHandler;
		private EntityResolver entityResolver;
		private ErrorHandler errorhandler;
		
		private Map featureMap = new HashMap();
		private Map propertyMap = new HashMap();
		
		public CSVParser() {
			featureMap.put(HTTP_XML_ORG_SAX_FEATURES_NAMESPACES, new Boolean(true));
		}

		public ContentHandler getContentHandler() {
			return this.contentHandler;
		}

		public void setContentHandler(ContentHandler contenthandler) {
			this.contentHandler = contenthandler;
		}
		
		public DTDHandler getDTDHandler() {
			return this.getDTDHandler();
		}

		public void setDTDHandler(DTDHandler dtdhandler) {
			this.dtdHandler = dtdhandler;
		}
		
		public EntityResolver getEntityResolver() {
			return this.entityResolver;
		}
		
		public void setEntityResolver(EntityResolver entityresolver) {
			this.entityResolver = entityresolver;
		}

		public ErrorHandler getErrorHandler() {
			return this.errorhandler;
		}

		public void setErrorHandler(ErrorHandler errorhandler) {
			this.errorhandler = errorhandler;
		}
		
		public boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException {
			Boolean value = (Boolean) featureMap.get(name);
			if(value == null){
				return false;
			}
			return value.booleanValue();
		}

		public void setFeature(String name, boolean value) throws SAXNotRecognizedException, SAXNotSupportedException {
			this.featureMap.put(name, new Boolean(value));			
		}
		
		public void setProperty(String name, Object value) throws SAXNotRecognizedException, SAXNotSupportedException {
			propertyMap.put(name, value);
		}
		
		public Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException {
			return propertyMap.get(name);
		}

		public void parse(String systemId) throws IOException, SAXException {
			parse(new InputSource(systemId));			
		}
		
		private boolean requiredNameSpace() throws SAXException {
			return getFeature(HTTP_XML_ORG_SAX_FEATURES_NAMESPACES);
		}
		
		public void parse(InputSource inputsource) throws IOException, SAXException {
			ContentHandler handler = getContentHandler();
			if(handler == null){
				return;
			}
			BufferedReader reader = null;
			if(inputsource.getCharacterStream()!=null){
				reader = new BufferedReader(inputsource.getCharacterStream());
			} else if (inputsource.getByteStream()!=null){
				reader = new BufferedReader(new InputStreamReader(inputsource.getByteStream()));
			} else if (inputsource.getSystemId() !=null && inputsource.getSystemId().trim().length()>0){
				URL url = new URL(inputsource.getSystemId());
				reader = new BufferedReader(new InputStreamReader(url.openStream()));
			}
			if(reader == null){
				throw new SAXException("invalid inputsource object");
			}
			handler.startDocument();
			if(requiredNameSpace()){
				handler.startElement("", "books", "books", EMPTY_ATTRS);
			} else {
				handler.startElement("", "", "books", EMPTY_ATTRS);
			}
			
			String line = null;
			while((line = reader.readLine())!=null){
				handler.startElement("", "book", "book", EMPTY_ATTRS);
				String[] values = line.split(",");
				if(values!=null && values.length>0){
					handler.startElement("", "name", "name", EMPTY_ATTRS);
					handler.characters(values[0].toCharArray(), 0, values[0].length());
					handler.endElement("", "name", "name");
					if(values.length>=2){
						handler.startElement("", "authors", "authors", EMPTY_ATTRS);
						handler.startElement("", "author", "author", EMPTY_ATTRS);
						handler.characters(values[1].toCharArray(), 0, values[1].length());
						handler.endElement("", "author", "author");
						handler.endElement("", "authors", "authors");
					}
				}
				handler.endElement("", "book", "book");
			}
			if(requiredNameSpace()){
				handler.endElement("", "books", "books");
			} else {
				handler.endElement("", "", "books");
			}
			handler.endDocument();
		}
	}
}

 

book.csv:

java & xml,dava
java xslt,martin
hibernate in action,gavin king
spring in action,test

 csv.xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	
	<xsl:template match="/">
		<html>
		<head>
			<title>books</title>
		</head>
		<body>
		<xsl:apply-templates/>
		</body>
		</html>
	</xsl:template>
	
	<xsl:template match="books">
		<table border="1">
			<tr>
				<td>no</td>
				<td>book name</td>
				<td>authors</td>
			</tr>
			<xsl:apply-templates select="book">
				<xsl:sort order="desending" data-type="text" select="name"/>
			</xsl:apply-templates>
		</table>
	</xsl:template>
	
	<xsl:template match="book">
		<tr>
			<td><xsl:value-of select="position()"/></td>
			<td><xsl:value-of select="name"/></td>
			<td><xsl:value-of select="authors"/></td>
		</tr>
	</xsl:template>
</xsl:stylesheet>
 

 

分享到:
评论

相关推荐

    SAX解析XML文件实例

    一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml文件的实例

    SAX.java 操作xml文件

    SAX.java 操作xml文件SAX.java 操作xml文件SAX.java 操作xml文件SAX.java 操作xml文件SAX.java 操作xml文件SAX.java 操作xml文件SAX.java 操作xml文件SAX.java 操作xml文件

    java用sax实现重写xml文件内容

    java用sax实现修改xml文件内容,util工具包中,包含所需jar文件、测试xml文件、startup.bat文件以及使用说明文档

    Servlet利用SAX解析XML文档

    Servlet利用SAX解析XML文档,JAX,JSWDP,Servlet利用SAX解析XML文档

    android sax ,dom生成xml文件

    android sax ,dom生成xml文件

    SAX解析超大XML文件 示例代码

    SAX解析超大XML文件 示例代码 SAX解析超大XML文件 示例代码 SAX解析超大XML文件 示例代码

    SAX2方法读取XML文件

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

    Servlet利用SAX解析XML文档(新上传的有源码)

    Servlet利用SAX解析XML文档(新上传的有源码)Servlet利用SAX解析XML文档(新上传的有源码)Servlet利用SAX解析XML文档(新上传的有源码)Servlet利用SAX解析XML文档(新上传的有源码)Servlet利用SAX解析XML文档(新上传的有...

    sax生成并解析大文件的xml

    用sax写的生成大XML文件。 用SAX写的解析大XML文件。 在解析大的XML文件,从java语言来说的话,目前应该SAX是比较好用的一个框架。

    Sax解析xml文件

    Sax解析xml文件详细例子,解析复杂节点的xml,把内容显示到view中,例子简单完整,易用

    Python SAX处理XML文件

    本代码是python下使用SAX才操作XML文件的。SAX是基于事件驱动的。在处理过程中,它将XML文档的处理转化为一系列事件的处理,通过事件处理器处理XML文档。它的速度很快,而且占用的内存很小,适用于一些比较大的XML...

    sax2.0.1jar,xml文件解析

    sax2.0.1版本的jar包,可用于xml文件的解析。 SAX是一种解析速度快并且占用内存少的XML解析器,非常适用于Android的移动设备。 SAX采用事件驱动`,也就是说,它并不是需要解析完整的文档,在按内容顺序解析文档的...

    Sax解析XML文件解析

    Sax解析XML文件解

    Android 中利用SAX ,Dom,pull解析 XML 文件代码

    Android 中利用SAX ,Dom,pull解析 XML 文件代码 每种方式都介绍了代码,具体的文档在个人博客: http://blog.csdn.net/blueskydyliu/article/details/7055311 中介绍了。

    dom解析和sax解析

    dom和sax解析的区别,dom的概念,sax的概念

    SAXParser-用SAX读取大于100M的xml文件(java)

    压缩包里面有两个文件:SAX.java和SAXparse.java 用来解析大于100M的xml文件,SAX读取xml不同于DOM方式,DOM方式在解析xml前需要全部加载xml文件,当xml文件很大时,就会出现内存不足的问题,而SAX则是逐行读取xml...

    android之利用SAX、DOM和Pull实现对schools.xml的解析

    利用SAX、DOM和Pull实现对schools.xml的解析,并进行单元测试 利用Pull实现schools.xml的创建

    sax解析xml文件

    绝对可用的SAX解析XML文件项目,费了九牛二虎之力,才找到的好资源,特与大家共享出来。直接导入eclipse就可运行,无需任何配置。

    SAX解析XML文件以及排序

    SAX解析XML文件以及对取出的id放进数组进行冒泡排序(从大到小排序和从小到大排序)

    XML文件c语言 dom和sax模式解析

    XML文件解析器 支持dom解析和sax模式解析,c语言实现

Global site tag (gtag.js) - Google Analytics