admin 管理员组

文章数量: 1184232


2024年4月19日发(作者:做网站无锡)

XML SAX应用程序异常

从上面的案例中,可以看出解析在调用parese方法时,必须使用try-catch语句

来捕获SAXException异常,当SAXException异常发生时,parse方法会离开结束

执行,停止解析过程。实际上,DefaultHandler类中的方法都可以抛出一个SAXEx

ception对象给解析器,比如,事件处理在调用startDocument()方法时,突然决定终

止解析文件,就可以抛出一个SAXException对象给解析器,解析器将停止parse方

法的执行。

现在创建一个案例,演示处理SAX异常。首先创建XML文档,打开记事本,

输入下列代码:

<学生名单>

<学生>

<姓名>崔忠伟

<出生日期>2006-13-20

将上述代码保存,名称为。创建解析XML文档的Java程序,打

开记事本,输入下列代码:

import s.*;

import s.*;

import .*;

import .*;

import .*;

public class Example9{

public static void main(String args[]){

try{

SAXParserFactory factory=tance();

SAXParser saxParser=Parser();

MyHandler handler=new MyHandler();

(new File(""),handler);

}

catch(Exception e){n(e); }

}

}

class MyHandler extends DefaultHandler{

boolean bo=false;

boolean sa=true;

public void startElement(String uri,String localName,String qName,Attributes atts) {

("<"+qName+">");

if(("出生日期"))

bo=true;

}

public void endElement(String uri,String localName,String qName) {

("<"+qName+">");

}

public void characters(char[] ch,int start,int length) throws SAXException{

String text=new String(ch,start,length);

if(bo==true){

text=();

StringTokenizer fenxi=new StringTokenizer(text,"-");

int number=okens();

String str[]=new String[number];

if(number!=3) {

sa=false;

}

else{

int k=0;

while(eTokens()){

str[k]=ken();

k++;

}

try{

int year=nt(str[0]);

int month=nt(str[1]);

int day=nt(str[2]);

if(year<=1900 || year>=2009)

sa=false;

if(month<=0 || month>=13)

sa=false;

if(day<=0 || day>31)

sa=false;

}

catch(NumberFormatException e){sa=false;}

}

if(sa==false){

throw new SAXException("数据不合理,停止解析");

}

else{

(text);

}

}

else{n(text);}

}

}

将上述代码保存,名称为。打开命令提示符窗口,编译并解释执

行该文件,会显示如图7-10所示窗口:

图7-10 SAX异常处理

该案例中,要求“出生日期”标记中的数据必须是合理的,比如年份必须是4

位数字,而且在1900-2009之间,月份应当在1-12之间,日期应当在1-31之间。

事件处理器在调用characters方法时,如果发现不合理的数据,就抛出一个SAXEx

ception对象给解析器,解析器停止parse方法的执行,不再报告任何事件给事件处

理器。

在character方法中,使用StringTokenizer类对获取的文本数据text进行拆分,

分隔符为“-”。如果获取的text数据拆分后,其大小不等于3,则将sa赋值为false。

调用nextToken方法获取拆分后的数据并存储到字符串数组str中。将数组str中的

数据进行转换,并分别赋值为year、month和day。下面使用if语句进行判断,如

果不符合条件,则将sa赋值为false。


本文标签: 方法 数据 解析 解析器