SAX解析xml文件
2016-03-16 13:04
447 查看
实现功能:将部署在服务器上的xml文件转化成流的形式和继承DefaultHandler类的自定义MyHandler类的提交给XMLParser类通过SAXParserFactory利用工厂模式对文件进行解析
要解析xml文件如下:
1,对MyHandler类进行分析
有以下几类成员:
list用来存放每个person标签的map对象
nodeName 表示传入要解析的标签名称
crruentTag 表示当前正在解析的标签名称
crruentValue 表示当前正在解释标签里面的内容
主要继承的方法有以下几个:
@Override
public void startDocument() throws SAXException {
list = new ArrayList<HashMap<String, String>>();
}
// 将每个元素的属性放入map中
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// 解析的元素为当前传进来的元素
if (qName.equals(nodeName)) {
map = new HashMap<String, String>();
}
// 遍历元素的属性并加入map中,如元素中的id属性,
if (attributes != null && map != null) {
for (int i = 0; i < attributes.getLength(); i++) {
map.put(attributes.getQName(i), attributes.getValue(i));
}
}
currentTag = qName;
}
// 这里面是元素里面的内容
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (currentTag != null && map != null) {
currentValue = new String(ch, start, length);
if (currentValue != null && !currentValue.trim().equals("")
&& !currentValue.trim().equals("/n")) {
map.put(currentTag, currentValue.trim());
}
}
//解析标签后将当前标签的名称和值都置为空
currentTag = null;
currentValue = null;
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (qName.equals(nodeName)) {
list.add(map);
map = null;
}
}DefaultHandler类解析xml文件的顺序参考:http://blog.csdn.net/neu_yousei/article/details/22647937?utm_source=tuicool&utm_medium=referral
2,对XmlReader类的分析
核心代码:public static List<HashMap<String, String>> readXml(InputStream is,
String nodeName) {
// 创建一个解析xml的工厂对象
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();
MyHandler myHandler = new MyHandler(nodeName);
parser.parse(is, myHandler);
is.close();
return myHandler.getList();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException | SAXException e) {
e.printStackTrace();
}
return null;
}3,对网页的xml文件的或许及转化成inputStream则参考
public static InputStream getInputStream() {
InputStream inputStream = null;
try {
URL url = new URL(PATH);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(3000);
conn.setDoInput(true);
conn.setRequestMethod("GET");
inputStream = conn.getInputStream();
} catch (Exception e) {
// TODO: handle exception
}
return inputStream;
}
要解析xml文件如下:
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>jack</name> <age>21</age> </person> <person id="25"> <name>july</name> <age>24</age> </person> </persons>
1,对MyHandler类进行分析
有以下几类成员:
private HashMap<String, String> map = null; private ArrayList<HashMap<String, String>> list = null; private String nodeName; private String currentTag; private String currentValue;hashmap 对象用来封装每个标签的属性和属性的值
list用来存放每个person标签的map对象
nodeName 表示传入要解析的标签名称
crruentTag 表示当前正在解析的标签名称
crruentValue 表示当前正在解释标签里面的内容
主要继承的方法有以下几个:
@Override
public void startDocument() throws SAXException {
list = new ArrayList<HashMap<String, String>>();
}
// 将每个元素的属性放入map中
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// 解析的元素为当前传进来的元素
if (qName.equals(nodeName)) {
map = new HashMap<String, String>();
}
// 遍历元素的属性并加入map中,如元素中的id属性,
if (attributes != null && map != null) {
for (int i = 0; i < attributes.getLength(); i++) {
map.put(attributes.getQName(i), attributes.getValue(i));
}
}
currentTag = qName;
}
// 这里面是元素里面的内容
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (currentTag != null && map != null) {
currentValue = new String(ch, start, length);
if (currentValue != null && !currentValue.trim().equals("")
&& !currentValue.trim().equals("/n")) {
map.put(currentTag, currentValue.trim());
}
}
//解析标签后将当前标签的名称和值都置为空
currentTag = null;
currentValue = null;
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (qName.equals(nodeName)) {
list.add(map);
map = null;
}
}DefaultHandler类解析xml文件的顺序参考:http://blog.csdn.net/neu_yousei/article/details/22647937?utm_source=tuicool&utm_medium=referral
2,对XmlReader类的分析
核心代码:public static List<HashMap<String, String>> readXml(InputStream is,
String nodeName) {
// 创建一个解析xml的工厂对象
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();
MyHandler myHandler = new MyHandler(nodeName);
parser.parse(is, myHandler);
is.close();
return myHandler.getList();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException | SAXException e) {
e.printStackTrace();
}
return null;
}3,对网页的xml文件的或许及转化成inputStream则参考
public static InputStream getInputStream() {
InputStream inputStream = null;
try {
URL url = new URL(PATH);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(3000);
conn.setDoInput(true);
conn.setRequestMethod("GET");
inputStream = conn.getInputStream();
} catch (Exception e) {
// TODO: handle exception
}
return inputStream;
}
相关文章推荐
- ubuntu 12.04安装、配置和使用tftp
- 复利计算3.0
- 用易语言编写的算术题程序
- 数字信号处理复习
- 关于Hi3516D启动死机的问题
- 图像特征提取之HOG+LBP+HAAR
- 【javacript】获得点击的标签
- 图形界面
- vs2012配置使用entity framework 6
- 0023-mybatis在mapper.xml文件中的sql语句
- UVa11827(欧几里得算法)
- 「付ける」和「付く」
- 实验三的项目分析
- 复利计算3.0
- 挑战 多重部分和问题
- PrintWriter out=response.getWriter()的问题
- 从零开始搭建 reviewboard 环境(五) -- reviewboard 在linux中的使用
- java线程(3)-多线程死锁
- PHP编码规范与PSR标准
- 如何利用FineBI做财务分析