XML:
目的:输入sn=01 把相应的student的肮name和age取回
<?xml-stylesheet type="text/xsl" href="student.xsl"?>
<students>
<student sn="01">
<name>gao</name>
<age>27</age>
</student>
<student sn="02">
<name>yu</name>
<age>24</age>
</student>
</students>
import java.io.File;
import java.io.IOException;
import java.util.Stack;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class StudentLookup extends DefaultHandler {
private String name;
private String age;
private String attrName;
private String attrValue;
private Stack tagsStack=new Stack();
public void setAttrName(String attrName)
{
this.attrName = attrName;
}
public void setAttrValue(String attrValue)
{
this.attrValue = attrValue;
}
public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException
{
if(tagsStack.empty())
{
if("student".equals(qName))
{
int len=attrs.getLength();
for(int i=0;i<len;i++)
{
if(attrName.equals(attrs.getQName(i)) &&
attrValue.equals(attrs.getValue(i)))
{
tagsStack.push(qName);
break;
}
}
}
}
else
{
tagsStack.push(qName);
}
}
public void characters(char[] ch, int start, int length) throws SAXException
{
if(!tagsStack.empty())
{
String tag=(String) tagsStack.peek();
if("name".equals(tag))
name=new String(ch,start,length);
if("age".equals(tag))
age=new String(ch,start,length);
}
}
public void endElement(String uri, String localName, String qName) throws SAXException
{
if(!tagsStack.empty())
{
String tag=(String)tagsStack.pop();
if(tagsStack.empty() && "student".equals(tag))
{
System.out.println("name: "+name);
System.out.println("age: "+age);
throw new SAXException("找到了匹配的学生");
}
}
}
public void endDocument() throws SAXException
{
System.out.println("没有找到匹配的学生");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public Stack getTagsStack() {
return tagsStack;
}
public void setTagsStack(Stack tagsStack) {
this.tagsStack = tagsStack;
}
public String getAttrName() {
return attrName;
}
public String getAttrValue() {
return attrValue;
}
public static void main(String[] args) {
if(args.length!=1){
System.out.println("usage:java StudentLookup key=value");
System.exit(0);
}
int index=args[0].indexOf("=");
if(index==-1){
System.out.println("usage:java StudentLookup key=value");
System.exit(0);
}
String str=args[0].substring(0,index);
StudentLookup sl=new StudentLookup();
sl.setAttrName(str);
String str1=args[0].substring(index+1);
sl.setAttrValue(str1);
String realpath=System.getProperty("user.dir")+File.separator+"src"+File.separator+"sax"+File.separator+"student.xml";
SAXParserFactory spf=SAXParserFactory.newInstance();
try {
SAXParser parser=spf.newSAXParser();
parser.parse(new File(realpath), sl);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
用异常完成查找,结果如下:
name: gao
age: 27
org.xml.sax.SAXException: 找到了匹配的学生
at sax.StudentLookup.endElement(StudentLookup.java:84)
at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:375)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:311)
at sax.StudentLookup.main(StudentLookup.java:148)
如果不想打印出异常堆栈,则只要屏蔽掉
catch (SAXException e) {
e.printStackTrace();
}