例如一個Example.xml文件如下:
<?xml version="1.0"?>
?<Shapes>
? <Triangle name="tri1" >
????? <x> 3 </x>
????? <y> 0 </y>
????? <height> 3 </height>
????? <width> 5 </width>
? </Triangle>
??
? <Triangle name="tri2">
????? <x> 5 </x>
????? <y> 0 </y>
????? <height> 3 </height>
????? <width> 5 </width>
? </Triangle>??
?
? <Square name="sq1" >
????? <x> 0 </x>
????? <y> 0 </y>
????? <height> 3 </height>
????? <width> 3 </width>
? </Square>
?
? <Circle name="circ1" >
???? <x> 10 </x>
????? <y> 10 </y>
????? <height> 3 </height>
????? <width> 3 </width>
? </Circle>
?</Shapes>
我寫的解析算法是:
先建立一個shape的父類 然后 創(chuàng)建Triangle ,Cricle,和Square的子類分別繼承 但是子類有自己的name屬性
然后建立解析類coding如下:
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
public class ParserOne extends DefaultHandler {
?Triangle tri;
?Square?? squ;
?Circle?? cir;
?List trislist=new ArrayList();
?List squslist=new ArrayList();
?List cirslist=new ArrayList();
?StringBuffer sb=new StringBuffer();
?boolean triangle=false;
?boolean square=false;
?boolean circle=false;
?@Override
?public void startDocument() throws SAXException {
??// TODO 自動生成方法存根
?
?}
?
?@Override
?public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
??// TODO 自動生成方法存根
?if(qName.equals("Triangle")){
??tri=new Triangle();
??tri.name=attributes.getValue(0);
??trislist.add(tri);
??triangle=true;
?}else if(qName.equals("Square")){
??squ=new Square();
??squ.name=attributes.getValue(0);
??squslist.add(squ);
??square=true;
?}else if(qName.equals("Circle")){
??cir=new Circle();
??cir.name=attributes.getValue(0);
???? cirslist.add(cir);
???? circle=true;
?}??? sb.delete(0, sb.length());
?}
?
?
?@Override
?public void characters(char[] ch, int start, int length) throws SAXException {
??// TODO 自動生成方法存根
??sb.append(ch,start,length);
?}
?@Override
?public void endElement(String uri, String localName, String qName) throws SAXException {
??// TODO 自動生成方法存根
?if(triangle){
??if(qName.equals("x")){
???? tri.x=Integer.parseInt(sb.toString().trim());
??}else if(qName.equals("y")){
???? tri.y=Integer.parseInt(sb.toString().trim());
??}else if(qName.equals("height")){
???? tri.height=Integer.parseInt(sb.toString().trim());
??}else if(qName.equals("width")){
??????? tri.width=Integer.parseInt(sb.toString().trim());
??}
?}else if(square){
??if(qName.equals("x")){
?????? squ.x=Integer.parseInt(sb.toString().trim());
???}else if(qName.equals("y")){
????squ.y=Integer.parseInt(sb.toString().trim());
???}else if(qName.equals("height")){
????squ.height=Integer.parseInt(sb.toString().trim());
???}else if(qName.equals("width")){
????squ.width=Integer.parseInt(sb.toString().trim());
???}?
?}else if(circle){
??if(qName.equals("x")){
????? cir.x=Integer.parseInt(sb.toString().trim());
??}else if(qName.equals("y")){
???cir.y=Integer.parseInt(sb.toString().trim());
??}else if(qName.equals("height")){
???cir.height=Integer.parseInt(sb.toString().trim());
??}else if(qName.equals("width")){
???cir.width=Integer.parseInt(sb.toString().trim());
??}?
?}
?if(qName.equals("Triangle")){
??? triangle=false;
??? }
??? if(qName.equals("Square")){
??? square=false;?
??? }
??? if(qName.equals("Circle")){
??? circle=false;
??? }
?}
??? @Override
?public void endDocument() throws SAXException {
??// TODO 自動生成方法存根
?
?}
??? public static void main(String[] args){
??? ?ParserOne par=new ParserOne();
??? ?try {
//通過XML閱讀工廠建立閱讀器(解析器) 這里依托xerces.jar 和里面的SAXparser 路徑? (使用SAX ?API解析器)
???XMLReader parser=XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
//有解析器建立攔截器(本例中把本類設(shè)置成為攔截器,也可以設(shè)置別的類)
???parser.setContentHandler(par);
//解析器解析(路徑)
???parser.parse("D:/Example.xml");
??} catch (Exception e) {
???// TODO 自動生成 catch 塊
???e.printStackTrace();
??}
??for(int i=0;i<par.trislist.size();i++){
???Triangle tr=(Triangle)par.trislist.get(i);
???tr.print(System.out);
??}
??for(int i=0;i<par.squslist.size();i++){
???Square sq=(Square)par.squslist.get(i);
???sq.print(System.out);
??}
??for(int i=0;i<par.cirslist.size();i++){
???Circle ci=(Circle)par.cirslist.get(i);
???ci.print(System.out);
??}
??
??? }
}
解析 結(jié)果如下:
name:tri1
x:3
y:0
height:3
width:5
name:tri2
x:5
y:0
height:3
width:5
name:sq1
x:0
y:0
height:3
width:3
name:circ1
x:10
y:10
height:3
width:3