- 新建java project,在src下建包xml,在包下建book.xml文件,代码如下:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<书架>
<书 name="yyyyyy" id="111">
<售价>20元</售价>
<书名>Java就业培训教程</书名>
<作者>张孝祥</作者>
</书>
<书>
<书名>JavaScript网页开发</书名>
<作者>张孝祥</作者>
<售价>28.00元</售价>
</书>
</书架>
2.在src下建包cn.itcast.sax,在包下建一个public类Demo和 两个默认类myhandler(用于显示book.xml的所有内容), myhandler2(用于处理显示book.xml的指定内容),具体代码如下:
package cn.itcast.sax;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
public class Demo1 {
//采用SAX方法解析xml文档
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//1.使用SAXParserFactory创建SAX解析工厂
SAXParserFactory spf=SAXParserFactory.newInstance();
//2.通过SAX解析工厂得到解析器对象
SAXParser sp=spf.newSAXParser();
//3.通过解析器对象得到一个XML的读取器
XMLReader reader=sp.getXMLReader();
//4.设置读取器的事件处理器,处理事件需要自己编写,并且必须在解析xml文件之前加载
reader.setContentHandler(new myHandler2());
//5.解析xml文件
reader.parse("src/xml/book1.xml");
}
}
class myHandler implements ContentHandler{
//myHandler实现ContentHandler接口需要实现ContentHandler的所有方法
//当一些方法用不到时,可以让该方法什么都不做,保持空的方法体
//myHandler处理器输出book1.xml的所有内容
@Override
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
// TODO Auto-generated method stub
System.out.println("当前解析到:"+qName+",这个标签是开始标签");
for(int i=0;i<atts.getLength();i++){
//输出当前标签的属性和属性值
String at_name=atts.getQName(i);
String at_value=atts.getValue(i);
System.out.println(at_name+"="+at_value);
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
System.out.println("标签内容为:"+new String(ch,start,length));
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
System.out.println("当前解析到:"+qName+",这个标签是结束标签");
}
//下面的方法用不到,只保留空的方法体,让方法不做任何操作
@Override
public void setDocumentLocator(Locator locator) {
// TODO Auto-generated method stub
}
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void startPrefixMapping(String prefix, String uri)
throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void endPrefixMapping(String prefix) throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void processingInstruction(String target, String data)
throws SAXException {
// TODO Auto-generated method stub
}
@Override
public void skippedEntity(String name) throws SAXException {
// TODO Auto-generated method stub
}
}
class myHandler2 extends DefaultHandler{
//DefaultHandler是对ContentHandler接口的默认实现
//myHander2继承DefaultHandler类便不需要重新实现ContentHandler接口的所有方法
//myHander2只需要重载DefaultHandler中需要用到的方法
//myHander2获取book.xml文档中指定的内容,此处用于获取book.xml文档的第一个售价值
boolean isok=false;//用于判定是否是需要获得的标签
int index=1;//当有多个相同的标签时,用于输出第index个标签值
@Override
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
// TODO Auto-generated method stub
if(qName.equals("售价")){
isok=true;
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
if(isok && index==1){
System.out.println("书的价格:"+new String(ch,start,length));
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
if(qName.equals("售价")){
isok=false;
index++;
}
}
}