现在网络上的SAX读取XML源码,一般都是针对大XML文件的,对于如何读取大字符串没有提及.
在调试的时候出现了错误,经过检查发现是参数Attributes 的问题,必须要指定它所在的包.这是一个要注意的地方.
源码如下:
package bos.unit.api;
import java.io.FileReader; import java.io.StringReader;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.helpers.XMLReaderFactory;
import com.sun.org.apache.xalan.internal.xsltc.runtime.Attributes; import com.sun.org.apache.xerces.internal.parsers.SAXParser;
/** * XML的SAX操作类 * @author * */ public class XMLSAXUnit extends DefaultHandler { private static StringBuffer sbuff; /** * 测试方法 * @param args 命令行参数 */ public static void main(String[] args) { try { XMLReader parser = XMLReaderFactory.createXMLReader(); XMLSAXUnit handler = new XMLSAXUnit(); parser.setContentHandler(handler); parser.setErrorHandler(handler);
FileReader r = new FileReader("D://Test1.XML"); StringReader sr = new StringReader("<?xml version=/"1.0/"?><T><A>asdsd</A><B>12</B><C>2312</C><D>TEST</D></T>"); parser.parse(new InputSource(sr)); } catch(Exception ex) { System.out.println(ex.getMessage()); } } /** * 构造函数 * */ public XMLSAXUnit() { super(); } /** * 事件处理:开始读取文档 * */ public void startDocument() { sbuff = new StringBuffer(); System.out.println("Start document:"); } /** * 事件处理:结束读取文档 */ public void endDocument() { System.out.println("End document:"); } /** * 事件处理:开始读取元素 * @param uri * @param Name * @param qName * @param atts */ public void startElement(String uri,String Name,String qName,org.xml.sax.Attributes attrs) { if("".equals(uri)) { System.out.println("Start element:" + qName); } else { System.out.println("Start element: {" + uri + "}" + Name); } } /** * 事件处理:结束读取元素 * @param uri * @param Name * @param qName */ public void endElement(String uri,String Name,String qName) { if("".equals(uri)) { System.out.println("End element:" + qName); } else { System.out.println("End element: {" + uri + "}" + Name); } } public void characters (char ch[], int start, int length) { System.out.print("Characters: /""); for (int i = start; i < start + length; i++) { switch (ch[i]) { case '//': System.out.print(""); break; case '"': System.out.print("///""); break; case '/n': System.out.print("//n "); break; case '/r': System.out.print("//r "); break; case '/t': System.out.print("//t "); break; default: System.out.print(ch[i]); break; } } System.out.print("/"/n"); sbuff.append(ch,start,length); sbuff.append(","); } }