使用JAXP进行sax解析

时间:2023-01-02 07:50:29
 package cn.liuning.sax;

 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 Exception {
//1.创建解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance(); //2.得到解析器
SAXParser sp = factory.newSAXParser(); //3.得到读取器
XMLReader reader = sp.getXMLReader(); //4.设置内容处理器
reader.setContentHandler(new TagValueHandler()); //5.读取xm文档内容
reader.parse("src/book.xml");
}
}
//得到xml文档的所有内容,实现接口ContentHandler
class ListHandler implements ContentHandler
{
@Override
public void setDocumentLocator(Locator locator) {
// TODO 自动生成的方法存根
}
@Override
public void startDocument() throws SAXException {
// TODO 自动生成的方法存根
}
@Override
public void endDocument() throws SAXException {
// TODO 自动生成的方法存根
}
@Override
public void startPrefixMapping(String prefix, String uri)
throws SAXException {
// TODO 自动生成的方法存根
}
@Override
public void endPrefixMapping(String prefix) throws SAXException {
// TODO 自动生成的方法存根
}
@Override//开始标签
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
System.out.println("<" + qName + ">");
//获取标签属性
for(int i=0;atts != null & i<atts.getLength();i++) //null
{
String attName = atts.getQName(i);
String attValue = atts.getValue(i); System.out.println(attName + "=" + attValue);
}
}
@Override//结束标签
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("<" + qName +">");
}
@Override//内容
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println(new String(ch,start,length));
}
@Override
public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException {
}
@Override
public void processingInstruction(String target, String data)
throws SAXException {
// TODO 自动生成的方法存根
}
@Override
public void skippedEntity(String name) throws SAXException {
// TODO 自动生成的方法存根
}
}
//不实现ContentHandler接口,因为里面有很多用不到的方法,sun公司已经写了缺省的是吸纳类
//阿么我只要继承然后写自己需要的方法就可以了。右键点击源码-覆盖实现方法 //获取指定标签的值
class TagValueHandler extends DefaultHandler{ private String currentTag; //记住当前解析到的是什么标签
private int needNumber = 1; //记住想获取第几个作者标签的值
private int currnetnumber=0;//当前解析到的是第几个 @Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException { currentTag = qName;
if(currentTag.equals("CreateTime")){
currnetnumber++;
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
currentTag = null;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException { if("CreateTime".equals(currentTag) && currnetnumber==needNumber){
System.out.println(new String(ch,start,length));
}
}
}