使用java自带的xml解析器解析xml
使用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的更多相关文章
- Java DOM解析器 - 解析XML文档
使用DOM的步骤 以下是在使用DOM解析器解析文档使用的步骤. 导入XML相关的软件包. 创建DocumentBuilder 从文件或流创建一个文档 提取根元素 检查属性 检查子元素 导入XML相关的 ...
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...
- 使用Pull解析器生成XML文件和读取xml文件
有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...
- JavaScript使用浏览器内置XML解析器解析DOM对象
所有现代浏览器都内建了供读取和操作 XML 的 XML 解析器.解析器把 XML 转换为 XML DOM 对象 (可通过 JavaScript 操作的对象). 一.获取DOM对象 XMLHttpReq ...
- 使用XML序列化器生成XML文件和利用pull解析XML文件
首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...
- 使用Pull解析器生成XML文件
有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使 ...
- 使用XMl序列化器生成xml文件
生成XML文件 创建几个虚拟的短信对象,存在list中 备份数据通常都是备份至sd卡 使用StringBuffer拼接字符串 把整个xml文件所有节点append到sb对象里 sb.append(&q ...
- HandlerMethodReturnValueHandler SpringMVC 参数解析 继承关系以及各解析器解析类型
I HandlerMethodReturnValueHandler (org.springframework.web.method.support) AbstractMessageConverterM ...
- HandlerMethodArgumentResolver SpringMVC 参数解析 继承关系以及各解析器解析类型
HandlerMethodArgumentResolver SpringMVC 参数解析 继承关系以及各解析器解析类型 I HandlerMethodArgumentResolver (org.spr ...
随机推荐
- 错误解决:error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token
今天看到一个比较有趣的题目,如下代码,分析输出结果 #include <stdio.h> void num(int &b) { b = 222; return; } int mai ...
- 在VS2013中配置QT5 win7_64
转自 在VS2013中配置QT5 win7_64 环境: win x64 + vs2013+QT5+vs_addin 下面示例正确配置QT以及VS2013 + QT Addin开发环境: 下载VS20 ...
- Mac OS X10.10_xcode6.1_ios8.1环境下,编译lame静态库libmp3lame.a,支持arm64 armv7s x86_64 i386 armv7指令集
近期升级了系统到Mac OS X 10.10 而且更新了XCode6.1和iOS 8.1 之前app用到的libmp3lame.a静态库.也要支持64位的模拟器(x86_64)和64位的真机(arm6 ...
- JavaScript编程随笔
尽管说用JS非常多年了,可是却一直停留在肤浅的阶段,对JS的机制原理依旧是一知半解,比如:闭包.尽管能说出一二.却不能说出三四,确实羞愧.近期恶补一番.并将比較与大家分享,希望对大家有些帮助. 闭包 ...
- 利用 border 实现的图片选区效果,只需一层图一蒙层
<html> <style> #p { background: url("http://soso5.gtimg.cn/sosopic_j/0/436416703332 ...
- pandas groupby 分组操作
最一般化的groupby 方法是apply. tips=pd.read_csv('tips.csv') tips[:5] 新生成一列 tips['tip_pct']=tips['tip']/tips[ ...
- [poj 3904] sky code 解题报告(组合计算+容斥原理)
题目链接:http://poj.org/problem?id=3904 题目大意: 给出一个数列,询问从中取4个元素满足最大公约数为1的方案数 题解: 很显然,ans=总的方案数-最大公约数大于1的4 ...
- BZOJ4479 [JSOI2013] 吃货jyy 解题报告(三进制状态压缩+欧拉回路)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4479 Description [故事背景]作为JSOI的著名吃货,JYY的理想之一就是吃 ...
- k-meas非监督聚类分析
实验名称: k-meas非监督聚类分析 一.实验目的和要求 目的: 加深对非监督学习的理解和认识 掌握聚类方法K-Means算法的设计方法 要求: 根据聚类数据,采用k-Means聚类 ...
- 51Nod 1010 只包含因子2 3 5的数(打表+二分)
K的因子中只包含2 3 5.满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15. 所有这样的K组成了一个序列S,现在给出一个数n,求S中 >= 给定数的最小的数. 例如:n = ...