Java XML解析 - 使用SAX 示例

关键注意(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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值