使用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

使用java自带的xml解析器解析xml的更多相关文章

  1. Java DOM解析器 - 解析XML文档

    使用DOM的步骤 以下是在使用DOM解析器解析文档使用的步骤. 导入XML相关的软件包. 创建DocumentBuilder 从文件或流创建一个文档 提取根元素 检查属性 检查子元素 导入XML相关的 ...

  2. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  3. 使用Pull解析器生成XML文件和读取xml文件

    有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...

  4. JavaScript使用浏览器内置XML解析器解析DOM对象

    所有现代浏览器都内建了供读取和操作 XML 的 XML 解析器.解析器把 XML 转换为 XML DOM 对象 (可通过 JavaScript 操作的对象). 一.获取DOM对象 XMLHttpReq ...

  5. 使用XML序列化器生成XML文件和利用pull解析XML文件

    首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...

  6. 使用Pull解析器生成XML文件

    有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...

  7. 使用XMl序列化器生成xml文件

    生成XML文件 创建几个虚拟的短信对象,存在list中 备份数据通常都是备份至sd卡 使用StringBuffer拼接字符串 把整个xml文件所有节点append到sb对象里 sb.append(&q ...

  8. HandlerMethodReturnValueHandler SpringMVC 参数解析 继承关系以及各解析器解析类型

    I HandlerMethodReturnValueHandler (org.springframework.web.method.support) AbstractMessageConverterM ...

  9. HandlerMethodArgumentResolver SpringMVC 参数解析 继承关系以及各解析器解析类型

    HandlerMethodArgumentResolver SpringMVC 参数解析 继承关系以及各解析器解析类型 I HandlerMethodArgumentResolver (org.spr ...

随机推荐

  1. 洛谷 P1169 [ZJOI2007]棋盘制作 (悬线法)

    和玉蟾宫很像,条件改成不相等就行了. 悬线法题目 洛谷 P1169  p4147  p2701  p1387 #include<cstdio> #include<algorithm& ...

  2. yum下载的rpm包离线安装

    #修改yum设置,让rpm包缓存到本地 vi /etc/yum.conf #修改keepcache为1 keepcache=1 #清空yum缓存 yum clean all #安装你要离线安装的rpm ...

  3. 机载LIDAR技术及其应用

    1 机载LIDAR的系统组成及原理 1.1 机载 LIDAR 技术的发展历程 LIDAR 技术和机载激光扫描技术的发展源自 1970 年,美国航空航天局(NASA)支持研制成功第一台对地观测 LIDA ...

  4. Solr教程--官方自带数据的三个练习及讨论翻译版本

    Solr教程 在你开始之前 解压Solr 练习1:索引Techproducts示例数据 在SolrCloud模式下启动Solr 索引技术产品数据 基本搜索 练习1总结 练习2:修改架构和索引影片数据 ...

  5. Android五天乐(第三天)ListFragment与ViewPager

    1ListFragment 今天首先学习了一种很经常使用的展示场景:列表展示. 昨天学习了使用Fragmet来取代activity进行设计.今天在托管单个fragment的基础上,掌握托管一个布局li ...

  6. Android学习笔记(9):使用XML文件和Java代码控制UI界面

    Android推荐使用XML文件设置UI界面.然后用Java代码控制逻辑部分,这体现了MVC思想. MVC全名是Model View Controller.是模型(model)-视图(view)-控制 ...

  7. WHERE、ORDER BY、GROUP BY、HAVING语句解析(二十八)

    之前啊,我们提及到,对于update和delete,若不带where条件,则对所有记录都有效. 一.WHERE条件表达式 (1)对记录进行过滤,如果没有指定WHERE子句,则显示所有记录. (2)在W ...

  8. SparkStreaming基础

    * SparkStreaming基础 打开之前构建好的Maven工程,如何构建?请参看SparkCore基础(二)的最后部分. 在SparkCore中,我们操作的数据都在RDD中,是Spark的一个抽 ...

  9. 项目中访问controller报错:HTTP Status 500 - Servlet.init() for servlet spring threw exception

    直接访问controller路径http://localhost:8080/index报错: HTTP Status 500 - Servlet.init() for servlet spring t ...

  10. js变量作用域和闭包的示例

    <script> /* js是函数级作用域,在函数内部的变量,内部都能访问, 外部不能访问内部的,但是内部可以访问外部的变量 闭包就是拿到本不该属于他的东西,闭包会造成内存泄漏,你不知道什 ...