SAX解析XMl

来源:互联网 发布:iphone拨号软件 编辑:程序博客网 时间:2024/06/05 19:44

// 载入xml

//1.创建解析工厂

SAXParserFactory factory=SAXParserFactory.newInstance();
//2.得到解析器
SAXParser sp=factory.newSAXParser();
//3.得到读取器
XMLReader reader=sp.getXMLReader();

//4.设置内容处理器 本步骤最重要  第五步已经完成处理了    

reader.setContentHandler(new ListHandler());
//5.读取xml文档内容

reader.parse("src/book.xml");


//得到xml文档所有内容
class 
ListHandler implements ContentHandler{

//遇到开始标签
@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++){
String attName=atts.getQName(i);
String attValue=atts.getValue(i);
System.out.println(attName+"="+attValue);
}
}

//标签体内容
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println(new String(ch,start,length));
}
//结束标签
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("</"+qName+">");

}
//此接口有很多方法 此处未用到没写出
}

//获取指定标签

//4.设置内容处理器
reader.setContentHandler(new TagValueHandler());


// 获取指定标签 作者 的值
class TagValueHandler extends DefaultHandler {
private String currentTag;// 记住当前解析器得到的是什么标签
private int needNumber = 2;// 记住想获取第几个作者标签的值
private int currentNumber;// 当前解析的是第几个


@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
currentTag = qName;
if ("作者".equals(currentTag))
currentNumber++;
}


@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if ("作者".equals(currentTag) && currentNumber == needNumber) {
System.out.println(new String(ch, start, length));
}
}


@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
currentTag = null;
}



}


//将内容封装为bean

reader.setContentHandler(new BeanListHandler());



// 把每一本书封装到一个book对象,并把book对象
class BeanListHandler extends DefaultHandler {
private List<Book> list = new ArrayList<Book>();


public List<Book> getList() {
return list;
}


private String currentTag;
private Book book;


@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
currentTag = qName;
if ("书".equals(currentTag)) {
book = new Book();
}
}


@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if ("书名".equals(currentTag)) {
book.setName(new String(ch, start, length));
}
if ("作者".equals(currentTag)) {
book.setAuthor(new String(ch, start, length));
}
if ("售价".equals(currentTag)) {
book.setPrice(new String(ch, start, length));
}
}


@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (qName.equals("书")) {
list.add(book);
book = null;
}
currentTag = null;// 这句有必要不加 报空指针异常
}
}




原创粉丝点击