Posted on 2006-09-25 15:50
开关 阅读(285)
评论(0) 编辑 收藏 所属分类:
XML
例如一个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的父类 然后 创建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");
//有解析器建立拦截器(本例中把本类设置成为拦截器,也可以设置别的类)
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);
}
}
}
解析 结果如下:
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