1 //------------------ main point ---------------------
2 javax.xml.parsers.SAXParserFactory3 public static voidmain(String[] args)4 {5 //cdu 存放结果的对象
6 CS3drawUnit cdu=newCS3drawUnit();7
8 SAXParserFactory factory =SAXParserFactory.newInstance();9
10 SAXParser parser;11 try{12 parser =factory.newSAXParser();13
14 /*// 方式一15 InputStream is=new ByteArrayInputStream(strxml.getBytes("UTF-8"));16 parser.parse(is, new Apphandler(cdu));17 */
18
19 //方式二
20 parser.parse(new File("cs3.xml"),newApphandler(cdu));21 }22 catch(ParserConfigurationException e) {23 //TODO Auto-generated catch block
24 e.printStackTrace();25 } catch(SAXException e) {26 //TODO Auto-generated catch block
27 e.printStackTrace();28 } catch(IOException e) {29 //TODO Auto-generated catch block
30 e.printStackTrace();31 }32 }33
34 //存放结果的实体35 //------------------CS3drawUnit bean---------------------
36 public classCS3drawUnit {37
38 //可以有多个 fields,因为太多我省略了好多
39 private String XWallThickness="";40
41 publicString getXWallThickness() {42 returnXWallThickness;43 }44 public voidsetXWallThickness(String xWallThickness) {45 XWallThickness =xWallThickness;46 }47
48 }49
50 //这就是处理类handler51 //------------------Apphandler ---------------------
52 importorg.xml.sax.Attributes;53 importorg.xml.sax.SAXException;54 importorg.xml.sax.helpers.DefaultHandler;55
56 public class Apphandler extendsDefaultHandler {57
58 /*
59 60 Type / tubes in face61 A (1/2" OD) / 1662 63
64 */
65
66
67 Unit u=null;68 //内部类 为了在characters方法中调用,使代码显的清晰
69 public classUnit{70
71 private String xname="";72 private String xvalue="";73 private String xmodelNo ="";74 private String xahTag ="";75
76
77 publicString getXahTag() {78 returnxahTag;79 }80 public voidsetXahTag(String xahTag) {81 this.xahTag =xahTag;82 }83 publicString getXname() {84 returnxname;85 }86 public voidsetXname(String xname) {87 this.xname =xname;88 }89 publicString getXvalue() {90 returnxvalue;91 }92 public voidsetXvalue(String xvalue) {93 this.xvalue =xvalue;94 }95 publicString getxmodelNo() {96 returnxmodelNo;97 }98 public voidsetxmodelNo(String xmodelNo) {99 this.xmodelNo =xmodelNo;100 }101
102
103 }104 CS3drawUnit cdu=null;105
106 private final int xname_STATE = 1;107 private final int xvalue_STATE = 2;108 private final int xmodelNo_STATE = 3;109 private final int xahTag_STATE = 4;110
111
112 private intcurrentState;113
114 publicApphandler(CS3drawUnit cdu)115 {116 this.cdu=cdu;117 currentState=0;118 u=newUnit();119 }120
121 //获取解析结果,可以再处理,此处把结果再加工,set到cdu实例中返回
122 ///@Override
123 public voidendElement(String uri, String localName, String qName)124 throwsSAXException {125
126
127 if(qName.equals("modelNo")&& u!= null){128 cdu.setXModelNo(u.getxmodelNo());129 }130 if(qName.equals("ahTag")&& u!= null){131 cdu.setXAhTag(u.getXahTag());132 }133
134 }135
136 public void startElement(String uri, String localName, String qName, Attributes attributes) throwsSAXException {137 //TODO Auto-generated method stub138 //System.out.println("qName:"+qName);
139 if (qName.equals("field")){140 u=newUnit();141 return;142 }143
144 if (qName.equals("name")){145 currentState =xname_STATE;146 return;147 }148
149 if (qName.equals("value")){150 currentState =xvalue_STATE;151 return;152 }153 if (qName.equals("modelNo")){154 currentState =xmodelNo_STATE;155 return;156 }157
158 if (qName.equals("ahTag")){159 currentState =xahTag_STATE;160 return;161 }162 }163
164
165 public void characters(char[] ch, int start, int length) throwsSAXException {166
167 //length这个值在某些情况下,会被裁断(莫名其妙),估计是bug,遇到过一回,168 //所以我在后来不让它解析出错时的字段,改用Dom解析。
169 String theString = newString(ch, start, length);170
171 switch(currentState)172 {173 casexname_STATE:174 u.setXname(theString);175 currentState = 0;176 break;177
178 casexvalue_STATE:179 u.setXvalue(theString);180 currentState = 0;181 break;182 casexmodelNo_STATE:183 u.setxmodelNo(theString);184 currentState = 0;185 break;186 casexahTag_STATE:187 u.setXahTag(theString);188 currentState = 0;189 break;190 }191 }192
193 }