使用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 ...
随机推荐
- docker mysql镜像忽略表名大小写
原文:docker mysql镜像忽略表名大小写 1.安装mysql镜像 docker pull mysql/mysql-server 2.运行mysql docker run --net=host ...
- CSDN博客给我带来的一些诱惑和选择机会
武汉九天鸟-p2p网贷系统开发-互联网应用软件开发 公司官网:http://jiutianniao.com 社交问答:http://ask.jiutianniao.com 最近1年多,尤其是今年5月 ...
- C语言中头文件尖括号和引号的区别
用include 引用头文件时,双引号和尖括号的区别: 1.双引号:引用非标准库的头文件,编译器首先在程序源文件所在目录查找,如果未找到,则去系统默认目录查找,通常用于引用用户自定义的头文件. 2.尖 ...
- 【codeforces 314C】Sereja and Subsequences
[题目链接]:http://codeforces.com/problemset/problem/314/C [题意] 让你从n个元素的数组中选出所有的不同的非递减子数列; 然后计算比这个子数列小的和它 ...
- [terry笔记]11gR2_DataGuard搭建_拷贝数据文件
11gR2搭建dataguard环境: 自己做的实验,后续按照rman模式搭建.主备切换.模式调整等实验会陆续发上来. primary: OS:oel 6.4 database:11.2.0.4.0 ...
- ie11 .pac代理脚本无法使用的问题
参考: http://blogs.msdn.com/b/ieinternals/archive/2013/10/11/web-proxy-configuration-and-ie11-changes. ...
- POJ--1966--Cable TV Network【无向图顶点连通度】
链接:http://poj.org/problem?id=1966 题意:一个无向图,n个点,m条边,求此图的顶点连通度. 思路:顶点连通度,即最小割点集里的割点数目.一般求无向图顶点连通度的方法是转 ...
- Hadoop - YARN NodeManager 剖析
一 概述 NodeManager是执行在单个节点上的代理,它管理Hadoop集群中单个计算节点,功能包含与ResourceManager保持通信,管理Container的生命周期.监控 ...
- BZOJ 1711 网络流
思路: 神建图 源->饮料 边权为1 牛拆点 两个点之间的边权为1 饮料->左牛 边权为1 右牛->食品 边权为1 食品->汇边权为1 //By SiriusRen #incl ...
- hbase伪分布安装配置
hbase1.2.4 伪分布式安装 注意:在安装hbase或者hadoop的时候,要注意hadoop和hbase的对应关系.如果版本不对应可能造成系统的不稳定和一些其他的问题.在hbase的lib ...