xml解析方式
2016-07-06 11:09
309 查看
1.sax
流解析,character函数可能执行多次,数据被截断,用StringBuffer在character方法中拼接字符串,在end方法中取数据才不会断,遇到一个问题,之前这么写的,在windows执行没有问题,但换到linux后有时候character被多次执行
修改后的代码
2.dom
把文件加载到内存中,不适用于大文件
流解析,character函数可能执行多次,数据被截断,用StringBuffer在character方法中拼接字符串,在end方法中取数据才不会断,遇到一个问题,之前这么写的,在windows执行没有问题,但换到linux后有时候character被多次执行
/** * */ package com.jiudao.www.util; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * @author lenovo0- * */ public class SaxParseService extends DefaultHandler{ private List<String> elementsList = null; private String datalogelement = null; private String preTag = null;//作用是记录解析时的上一个节点名称 public List<String> getElements(InputStream xmlStream) throws Exception{ SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); SaxParseService handler = new SaxParseService(); parser.parse(xmlStream, handler); return handler.getDatalogElements(); } public List<String> getDatalogElements(){ return elementsList; } @Override public void startDocument() throws SAXException { elementsList = new ArrayList<String>(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { preTag = qName;//将正在解析的节点名称赋给preTag } @Override public void endElement(String uri, String localName, String qName) throws SAXException { preTag = null; } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(preTag!=null){ String content = new String(ch,start,length); if(preTag.equals("datalogelement")){ elementsList.add(content); //System.out.println("content:"+content); } } // } }
修改后的代码
/** * */ package com.jiudao.www.util; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * @author lenovo0- * */ public class SaxParseService extends DefaultHandler{ private List<String> elementsList = null; private String preTag = null;//作用是记录解析时的上一个节点名称 private StringBuilder sb; public List<String> getElements(InputStream xmlStream) throws Exception{ SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); SaxParseService handler = new SaxParseService(); parser.parse(xmlStream, handler); return handler.getDatalogElements(); } public List<String> getDatalogElements(){ return elementsList; } @Override public void startDocument() throws SAXException { elementsList = new ArrayList<String>(); sb = new StringBuilder(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { preTag = qName;//将正在解析的节点名称赋给preTag } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(qName.equals("datalogelement")){ elementsList.add(sb.toString()); } preTag = null; } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(preTag!=null){ String content = new String(ch,start,length); // if(preTag.equals("datalogelement")){ // elementsList.add(content); // //System.out.println("content:"+content); // } sb.append(content); } } }
2.dom
把文件加载到内存中,不适用于大文件
相关文章推荐
- php常用header头信息收藏
- 【log4j2 加载配置文件】 加载配置文件的三种方法
- oracle 12c:新特性-限制PGA的大小
- mybatis传参总结
- QT5,5 webview 刷新不出网页解决的办法
- MD5Util (MD5加密摘要算法)。
- swiper的基础使用(十六)
- C++中的宏定义
- Windows 修改MySQL配置文件my.ini不起作用
- 定价类型更新
- 嵌入式 Linux系统编程(五)——目录文件函数
- Fires Dynamics Simulator(FDS)软件运行代码说明
- 剑指Offer:面试题12——打印1到最大的n位数(java实现)
- RecyclerView源码分析
- SVN还原文件到历史版本详解
- centos安装配置svn
- javascript 函数
- ArcGIS Server如何获取图层要素值?
- [iOS 扩展转] iOS扩展开发-Today扩展&share扩展
- linux tcpdump 及 windows wireshark 使用整理