用SAX方式解析XML

glassfish01 2009-10-23 08:46:00
用SAX方式解析XML,XML文件如下:

<?xml version="1.0" encoding="gb2312"?>

<person>

<name>王飞红</name>

<college>信息学院</college>

<telephone>6253113</telephone>

<notes>男,1955年生,博士,95年调入海南大学</notes>

</person>
...全文
184 6 打赏 收藏 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
shihuaxian123 2009-10-23
  • 打赏
  • 举报
回复
我只会js解析xml
swandragon 2009-10-23
  • 打赏
  • 举报
回复

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("****文件解析完毕****");
}
}
zjx2388 2009-10-23
  • 打赏
  • 举报
回复
4中解析xml的方式:http://zhoujingxian.javaeye.com/blog/438750
sax的:
bean:
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文件格式如下:

  <?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>
zxlion 2009-10-23
  • 打赏
  • 举报
回复
事件回调类SAXHandler.java
import java.io.*;
import java.util.Hashtable;
import org.xml.sax.*;
public class SAXHandler extends HandlerBase
{
private Hashtable table = new Hashtable();
private String currentElement = null;
private String currentValue = null;
public void setTable(Hashtable table)
{
this.table = table;
}
public Hashtable getTable()
{
return table;
}
public void startElement(String tag, AttributeList attrs)
throws SAXException
{
currentElement = tag;
}
public void characters(char[] ch, int start, int length)
throws SAXException
{
currentValue = new String(ch, start, length);
}
public void endElement(String name) throws SAXException
{
if (currentElement.equals(name))
table.put(currentElement, currentValue);
}
}
JSP内容显示源码,SaxXml.jsp:
<HTML>
<HEAD>
<TITLE>剖析XML文件people.xml</TITLE>
</HEAD>
<BODY>
<%@ page errorPage="ErrPage.jsp"
contentType="text/html;charset=GB2312" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.Hashtable" %>
<%@ page import="org.w3c.dom.*" %>
<%@ page import="org.xml.sax.*" %>
<%@ page import="javax.xml.parsers.SAXParserFactory" %>
<%@ page import="javax.xml.parsers.SAXParser" %>
<%@ page import="SAXHandler" %>
<%
File file = new File("c:\people.xml");
FileReader reader = new FileReader(file);
Parser parser;
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
SAXHandler handler = new SAXHandler();
sp.parse(new InputSource(reader), handler);
Hashtable hashTable = handler.getTable();
out.println("<TABLE BORDER=2><CAPTION>教师信息表</CAPTION>");
out.println("<TR><TD>姓名</TD>" + "<TD>" +
(String)hashTable.get(new String("name")) + "</TD></TR>");
out.println("<TR><TD>学院</TD>" + "<TD>" +
(String)hashTable.get(new String("college"))+"</TD></TR>");
out.println("<TR><TD>电话</TD>" + "<TD>" +
(String)hashTable.get(new String("telephone")) + "</TD></TR>");
out.println("<TR><TD>备注</TD>" + "<TD>" +
(String)hashTable.get(new String("notes")) + "</TD></TR>");
out.println("</TABLE>");
%>
</BODY>
</HTML>
amdgaming 2009-10-23
  • 打赏
  • 举报
回复
http://blog.csdn.net/success_dream/archive/2006/12/01/1424579.aspx
多google
amdgaming 2009-10-23
  • 打赏
  • 举报
回复

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();
}

}

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧