使用java自带的xml解析器解析xml,
其实我不推荐,可以用Dom解析,或其他的方式,
因为Java自带的解析器使用不但麻烦,且还有bug出现。

它要求,针对不同的xml(结构不同),必须写对应的handler处理类,
而Dom解析可以写通用的方法(前提是要写出通用逻辑)来处理,开发比较快。
下面上代码

 //------------------ main point ---------------------
javax.xml.parsers.SAXParserFactory
public static void main(String[] args)
{
//cdu 存放结果的对象
CS3drawUnit cdu=new CS3drawUnit(); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser;
try {
parser = factory.newSAXParser(); /* // 方式一
InputStream is=new ByteArrayInputStream(strxml.getBytes("UTF-8"));
parser.parse(is, new Apphandler(cdu));
*/ // 方式二
parser.parse(new File("cs3.xml"),new Apphandler(cdu));
}
catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // 存放结果的实体
//------------------CS3drawUnit bean---------------------
public class CS3drawUnit { //可以有多个 fields,因为太多我省略了好多
private String XWallThickness=""; public String getXWallThickness() {
return XWallThickness;
}
public void setXWallThickness(String xWallThickness) {
XWallThickness = xWallThickness;
} } // 这就是处理类handler
//------------------Apphandler ---------------------
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class Apphandler extends DefaultHandler { /*
<field>
<name>Type / tubes in face</name>
<value>A (1/2" OD) / 16</value>
</field> */ Unit u=null;
//内部类 为了在characters方法中调用,使代码显的清晰
public class Unit{ private String xname="";
private String xvalue="";
private String xmodelNo ="";
private String xahTag =""; public String getXahTag() {
return xahTag;
}
public void setXahTag(String xahTag) {
this.xahTag = xahTag;
}
public String getXname() {
return xname;
}
public void setXname(String xname) {
this.xname = xname;
}
public String getXvalue() {
return xvalue;
}
public void setXvalue(String xvalue) {
this.xvalue = xvalue;
}
public String getxmodelNo() {
return xmodelNo;
}
public void setxmodelNo(String xmodelNo) {
this.xmodelNo = xmodelNo;
} }
CS3drawUnit cdu=null; private final int xname_STATE = 1;
private final int xvalue_STATE = 2;
private final int xmodelNo_STATE = 3;
private final int xahTag_STATE = 4; private int currentState; public Apphandler(CS3drawUnit cdu)
{
this.cdu=cdu;
currentState=0;
u=new Unit();
} //获取解析结果,可以再处理,此处把结果再加工,set到cdu实例中返回
///@Override
public void endElement(String uri, String localName, String qName)
throws SAXException { if(qName.equals("modelNo")&& u!= null){
cdu.setXModelNo(u.getxmodelNo());
}
if(qName.equals("ahTag")&& u!= null){
cdu.setXAhTag(u.getXahTag());
} } public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
//System.out.println("qName:"+qName);
if (qName.equals("field")){
u=new Unit();
return;
} if (qName.equals("name")){
currentState = xname_STATE;
return ;
} if (qName.equals("value")){
currentState = xvalue_STATE;
return ;
}
if (qName.equals("modelNo")){
currentState = xmodelNo_STATE;
return ;
} if (qName.equals("ahTag")){
currentState = xahTag_STATE;
return ;
}
} public void characters(char[] ch, int start, int length) throws SAXException { //length这个值在某些情况下,会被裁断(莫名其妙),估计是bug,遇到过一回,
//所以我在后来不让它解析出错时的字段,改用Dom解析。
String theString = new String(ch, start, length); switch(currentState)
{
case xname_STATE:
u.setXname(theString);
currentState = 0;
break; case xvalue_STATE:
u.setXvalue(theString);
currentState = 0;
break;
case xmodelNo_STATE:
u.setxmodelNo(theString);
currentState = 0;
break;
case xahTag_STATE:
u.setXahTag(theString);
currentState = 0;
break;
}
} }

若转载请标注  :转自 博客园 : http://www.cnblogs.com/rojas/p/4013297.html

最新文章

  1. [LeetCode] Permutation Sequence 序列排序
  2. Python 实现Windows开机运行某软件
  3. 关于ssh_copy_id脚本解析
  4. oracle权限语句大全
  5. Verilog学习笔记简单功能实现(六)...............计数分频电路
  6. HTML5中lineCap端点样式遇到closePath()
  7. Codeforces 451E Devu and Flowers(组合计数)
  8. js 合并表格
  9. ios oc ui 路径和颜色设置--崩溃解决方案
  10. Socket 两平台互相 通信 .NET
  11. 平衡二叉树(AVL)java实现
  12. memcache 数据库信息存储到数据库减少IO 操作
  13. 关于C#中Thread.Join()的一点理解
  14. Spring 使用AspectJ的三种方式
  15. SSM框架—详细整合教程(Spring+SpringMVC+MyBatis)
  16. 图解TCP三次握手
  17. LabVIEW中开放隐藏属性的inikey
  18. 获取url参数的方法(web)
  19. powershell 删除8天前的日志
  20. [HDU 1215] 七夕节(求因子,不超时)

热门文章

  1. Windows和Linux的编译理解
  2. wipefs进程是啥,占用了百分之90多的cpu
  3. SolrCloud怎样创建跟新索引信息
  4. Log4j-----Log4j使用指南
  5. Android清单文件具体解释(六) ---- &amp;lt;activity&amp;gt;节点的属性
  6. 上传canvas图片到服务器
  7. 安卓开发--AsyncTask
  8. 项目中log4j的使用
  9. PostgreSQL Replication之第二章 理解PostgreSQL的事务日志(2)
  10. html页面颜色名称和颜色值转换