62,620
社区成员
发帖
与我相关
我的任务
分享
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.io.*;
/**
* <p>
* Title: 使用SAX解析XML
* </p>
* <p>
* Description: 使用SAX接口解析student.xml文件
* </p>
* <p>
* Copyright: Copyright (c) 2003
* </p>
* <p>
* Filename: SaxParsePage.java
* </p>
*
* @version 1.0
*/
public class SaxParseXml extends DefaultHandler {
/**
* <br>
* 方法说明:主方法,声明解析工厂和加载XML文件 <br>
* 输入参数: <br>
* 返回类型:
*/
public static void main(String[] argv) throws Exception {
long startTime = System.currentTimeMillis();
try{
// 建立SAX解析工厂
SAXParserFactory spfactory = SAXParserFactory.newInstance();
// 生成SAX解析对象
SAXParser parser = spfactory.newSAXParser();
// 指定XML文件,进行XML解析
parser.parse(new File("student.xml"), new SaxParseXml());
}catch(Exception e){
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println(((endTime-startTime)/1000.0));
}
/**
* <br>
* 方法说明:文件打开时调用 <br>
* 输入参数: <br>
* 返回类型:
*/
public void startDocument() {
System.out.println("***开始解析***");
}
/**
* <br>
* 方法说明:当遇到开始标记时调用 <br>
* 输入参数: <br>
* 返回类型:
*/
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("节点开始:" + qName);
for (int i = 0; i < attributes.getLength(); i++) {
System.out.println("节点属性名称:" + attributes.getQName(i));
System.out.println("节点属性值:" + attributes.getValue(i));
}
}
/**
* <br>
* 方法说明:当分析器遇到无法识别为标记或者指令类型字符时调用 <br>
* 输入参数: <br>
* 返回类型:
*/
public void characters(char[] ch, int offset, int length) throws SAXException {
System.out.println("节点数据:" + new String(ch, offset, length));
}
/**
* <br>
* 方法说明:当遇到节点结束时调用 <br>
* 输入参数: <br>
* 返回类型:
*/
public void endElement(String uri, String localName, String qName) {
System.out.println("节点结束:" + qName);
}
/**
* <br>
* 方法说明:当到文档的末尾调用 <br>
* 输入参数: <br>
* 返回类型:
*/
public void endDocument() {
System.out.println("****文件解析完毕****");
}
}
Bean文件:
package com.test;import org.xml.sax.*;import org.xml.sax.helpers.*;import javax.xml.parsers.*;
public class MyXMLReader extends DefaultHandler {
java.util.Stack tags = new java.util.Stack();
public MyXMLReader() {
super();}
public static void main(String args[]) {
long lasting = System.currentTimeMillis();
try {
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
MyXMLReader reader = new MyXMLReader();
sp.parse(new InputSource("data_10k.xml"), reader);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + "毫秒");}
public void characters(char ch[], int start, int length) throws SAXException {
String tag = (String) tags.peek();
if (tag.equals("NO")) {
System.out.print("车牌号码:" + new String(ch, start, length));}if (tag.equals("ADDR")) {
System.out.println("地址:" + new String(ch, start, length));}}
public void startElement(String uri,String localName,String qName,Attributes attrs) {
tags.push(qName);}} XML文件格式如下:
<?xml version="1.0" encoding="GB2312"?>
<RESULT>
<VALUE>
<NO>A1234</NO>
<ADDR>四川省XX县XX镇XX路X段XX号</ADDR></VALUE><VALUE>
<NO>B1234</NO>
<ADDR>四川省XX市XX乡XX村XX组</ADDR>
</VALUE>
</RESULT>
2. Xml文件解析
在java语言环境里可以使用三种方法解析xml文件:dom(document object model),sax(simple api for xml)和jdom(java document object model)。
SAX提供了基于事件的方式进行解析,适合于快速,数据量小的解析情况。SAX解析有几个缺陷:A.它的解析是连续的;B.数据无法回朔。
DOM解析不同于SAX。它提供了内存中完整的xml数据映像,数据被存储在树状结构中。DOM解析方式更容易获得和处理数据。
JDOM是java语言中特有的,主要用来支持xpath标准。
3. SAX解析方式
上面我简要介绍了几种解析xml文件的技术,这里我们使用SAX技术给出一个小例子,大家可以从这个例子中发现如果你能够掌握一些开源软件包,你就可以很快掌握解析xml数据的技术。
3.1制作一个简单的xml文件component.xml
<?xml version="1.0"?>
<XmlComponents>
<XmlComponent>
<ComNo>1</ComNo>
</XmlComponent>
</XmlComponents>
3.2下载xerces.jar软件包
在Apache网站上×××下载xerces.jar软件包,这个包中包含了上面我们列举的几种解析xml数据的API。然后将这个软件包加入到程序的classpath中。
3.3制作解析类MySaxParser.java
import java.io.IOException;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
public class MySaxParser extends DefaultHandler {
private static int INDENT = 2;
// 运行主方法
public static void main(String[] argv) {
// if (argv.length != 1) {
// System.out.println("Usage: java ds.MySaxParser [URI]");
// System.exit(0);
// }
System.setProperty("javax.xml.parsers.SAXParserFactory", "org.apache.xerces.jaxp.SAXParserFactoryImpl");
// String uri = argv[0];
String uri = "Components.xml";
try {
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
parserFactory.setValidating(false);
parserFactory.setNamespaceAware(false);
MySaxParser MySaxParserInstance = new MySaxParser();
SAXParser parser = parserFactory.newSAXParser();
parser.parse(uri, MySaxParserInstance);
}
catch(IOException ex) {
ex.printStackTrace();
}
catch(SAXException ex) {
ex.printStackTrace();
}
catch(ParserConfigurationException ex) {
ex.printStackTrace();
}
catch(FactoryConfigurationError ex) {
ex.printStackTrace();
}
}
private int idx = 0; //indent
// 处理各种分隔符号
public void characters(char[] ch, int start, int length) throws SAXException {
//instantiates s, indents output, prints character values in element
String s = new String(ch, start, length);
if (!s.startsWith("\n")) //空的value不打印
System.out.println(getIndent()+ " Value: " + s);
}
// 处理文档尾
public void endDocument() throws SAXException {
idx -= INDENT;
System.out.println(getIndent() + "end document");
System.out.println("...PARSING ends");
}
// 处理标记尾
public void endElement(String uri, String localName, String qName) throws SAXException {
idx -= INDENT;
}
// 处理文档的起始点
public void startDocument() throws SAXException {
idx += INDENT;
System.out.println("PARSING begins...");
System.out.println(getIndent() + "start document: ");
}
// 处理标记头
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
idx += INDENT;
System.out.println('\n' + getIndent() + "start element: " + qName);
}
private String getIndent() {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < idx; i++)
sb.append(" ");
return sb.toString();
}
}