您的位置:首页 > 编程语言 > Java开发

Java XML解析 - 使用SAX 示例

2006-11-25 01:42 1091 查看
关键注意(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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: