关键注意(SAX解析XML是基于事件模型的,即以消息机制的。):
DefaultHandler类(org.xml.sax.helpers.DefaultHandler),java.io.CharArrayWriter类,javax.xml.parsers.SAXParserFactory类,javax.xml.parsers.SAXParser类
函数有:
public void startDocument() throws SAXException;
public void endDocument() throws SAXException;
public void startElement(String namesapaceURI, String localname, String qName, Attributes attr) throws SAXException;
public void endElement(String namespaceURI, String localName, String qName) throws SAXException;
public void characters(char[] ch,int start, int length) throws SAXException;
分别是重写了CALLBACK方法:startDocument,endDocument,startElement,endElement,characters方法。
作用分别是当访问文档开始时、访问文档结束、访问元素开始、访问元素结束、遇到不能作为tag的字符串时候调用(即遇到类似<mytag>Hello,I am Alex!</mytag>中的"Hello,I am Alex!"时调用)。
另外注意:创建一个解析XML类的步骤,如何将自定义的类绑定为“DefaulHandler”(即saxParser.parse(new File("ticketRequest.xml"), trp);)。
实际上,以下程序虽然很简单,但确是SAX方法解析XML的基本框架。
//TicketReuqestParser.java
package myjaxp;
import myjaxp.TicketRequest2;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
import java.io.*;
public class TicketReuqestParser extends DefaultHandler
{
private CharArrayWriter buffer=new CharArrayWriter();
static TicketRequest2 tr2;
String custIDString;
String cruiseIDString;
public void startDocument() throws SAXException
{
System.out.println("startDocument() called");
}
public void endDocument() throws SAXException
{
System.out.println("endDocument() called");
}
public void startElement(String namesapaceURI, String localname, String qName, Attributes attr) throws SAXException
{
for (int i=0; i<attr.getLength(); i++)
{
String attrName=attr.getQName(i);
if (attrName.equals("custID"))
{
custIDString=attr.getValue(i);
}
if (attrName.equals("cruiseID"))
{
cruiseIDString=attr.getValue(i);
}
}
buffer.reset();
}
public void endElement(String namespaceURI, String localName, String qName) throws SAXException
{
//System.out.println("endElement called");
storeElement(qName);
}
public void characters(char[] ch,int start, int length) throws SAXException
{
buffer.write(ch,start,length);
}
private void storeElement(String elementName)
{
if (elementName.equals("ticketRequest"))
{
}
if (elementName.equals("customer"))
{
tr2.setCustID(Integer.parseInt(custIDString));
}
if (elementName.equals("firstName"))
{
tr2.setFirstName(buffer.toString());
}
if (elementName.equals("lastName"))
{
tr2.setLastName(buffer.toString());
}
if (elementName.equals("cruise")) {
tr2.setCruiseID(Integer.parseInt(cruiseIDString));
}
if (elementName.equals("destination"))
{
tr2.setDestination(buffer.toString());
}
if (elementName.equals("port"))
{
tr2.setPort(buffer.toString());
}
if (elementName.equals("sailing"))
{
tr2.setSailing(buffer.toString());
}
if (elementName.equals("numberOfTickets"))
{
String numberOfTicketString=buffer.toString();
int numberOfTickets;
if (!numberOfTicketString.equals(""))
{
numberOfTickets = Integer.parseInt(numberOfTicketString);
tr2.setNumberOfTickets(numberOfTickets);}
}
if (elementName.equals("isCommissionable"))
{
tr2.setCommissionable(true);
}
}
public String toString()
{
return tr2.toString();
}
public static void main(String[] args)
{
System.out.println("TicketRequestParser main()");
DefaultHandler trp=new TicketReuqestParser();
tr2=new TicketRequest2();
SAXParserFactory factory=SAXParserFactory.newInstance();
try
{
SAXParser saxParser=factory.newSAXParser();
saxParser.parse(new File("ticketRequest.xml"), trp);
}
catch(Exception e)
{
System.out.println("Exception in :"+e);
}
System.out.println(trp);
}
}
附:
/*
* TicketRequest2.java
*
* Created on January 19, 2002, 11:22 AM
*/
package myjaxp;
/**
*
* @author Stephen Potts
* @version
*/
public class TicketRequest2 implements java.io.Serializable
{
//information about the customer
int custID;
String lastName;
String firstName;
//information about the cruise
int cruiseID;
String destination;
String port;
String sailing;
int numberOfTickets;
boolean commissionable;
boolean approved;
public TicketRequest2()
{
}
/** Constructor */
public TicketRequest2(int custID, String lastName, String firstName,
int cruiseID, String destination,
String port, String sailing, int numberOfTickets,
boolean isCommissionable)
{
//set the information about the customer
this.custID = custID;
this.lastName = lastName;
this.firstName = firstName;
//set the information about the cruise
this.cruiseID = cruiseID;
this.destination = destination;
this.port = port;
this.sailing = sailing;
this.numberOfTickets = numberOfTickets;
this.commissionable = commissionable;
this.approved = false;
}
public int getCustID()
{
return this.custID = custID;
}
public String getLastName()
{
return this.lastName = lastName;
}
public String getFirstName()
{
return this.firstName = firstName;
}
public int getCruiseID()
{
return this.cruiseID;
}
public String getDestination()
{
return this.destination;
}
public String getPort()
{
return this.port;
}
public String getSailing()
{
return this.sailing;
}
public int getNumberOfTickets()
{
return this.numberOfTickets;
}
public boolean isCommissionable()
{
return this.commissionable;
}
public boolean isApproved()
{
return approved;
}
public void setCustID(int custID)
{
this.custID = custID;
}
public void setLastName(String lastName)
{
this.lastName = lastName;
}
public void setFirstName(String firstName)
{
this.firstName = firstName;
}
public void setCruiseID(int cruiseID)
{
this.cruiseID = cruiseID;
}
public void setDestination(String destination)
{
this.destination = destination;
}
public void setPort(String port)
{
this.port = port;
}
public void setSailing(String sailing)
{
this.sailing = sailing;
}
public void setNumberOfTickets(int numberOfTickets)
{
this.numberOfTickets = numberOfTickets;
}
public void setCommissionable(boolean commissionable)
{
this.commissionable = commissionable;
}
public void approve()
{
approved = true;
}
public void disApprove()
{
approved = false;
}
public String toString()
{
String outString;
outString = "-------------------------------------------" + "/n";
//information about the customer
outString += "custID = " + this.custID + "/n";
outString += "lastName = " + this.lastName + "/n";
outString += "firstName = " + this.firstName + "/n";
outString += "-----------------------------------------" + "/n";
//information about the cruise
outString += "cruiseID = " + this.cruiseID + "/n";
outString += "destination = " + this.destination + "/n";
outString += "port = " + this.port + "/n";
outString += "sailing = " + this.sailing + "/n";
outString += "numberOfTickets = " + this.numberOfTickets + "/n";
//information about the status
outString += "commissionable = " + this.commissionable + "/n";
outString += "approved? = " + this.approved + "/n";
outString += "-----------------------------------------" + "/n";
return outString;
}
}
///
ticketRequest.xml
<?xml version='1.0' encoding='utf-8' standalone='no' ?>
<!--This XML document represents a request for a cruise ticket-->
<!DOCTYPE ticketRequest SYSTEM "ticketRequest.dtd">
<ticketRequest>
<customer custID="10003" >
<lastName>Carter</lastName>
<firstName>Joseph</firstName>
</customer>
<cruise cruiseID="3004">
<destination>Hawaii</destination>
<port>Honolulu</port>
<sailing>7/7/2001</sailing>
<numberOfTickets>5</numberOfTickets>
<isCommissionable/>
</cruise>
</ticketRequest>
ticketRequest.dtd
<!ELEMENT ticketRequest (customer, cruise)>
<!ELEMENT customer ( lastName, firstName)>
<!ATTLIST customer custID NMTOKEN #REQUIRED>
<!ELEMENT lastName (#PCDATA)>
<!ELEMENT firstName (#PCDATA)>
<!ELEMENT cruise (destination, port, sailing, numberOfTickets,isCommissionable?)>
<!ATTLIST cruise cruiseID NMTOKEN #REQUIRED>
<!ELEMENT destination (#PCDATA)>
<!ELEMENT port (#PCDATA)>
<!ELEMENT sailing (#PCDATA)>
<!ELEMENT numberOfTickets (#PCDATA)>
<!ELEMENT isCommissionable EMPTY>