SAX写入xml 与 封装
来源:互联网 发布:手机越狱软件下载 编辑:程序博客网 时间:2024/06/05 17:17
需求:将List<Book>对象转换成<table> <row> <属性名>value </属性名>....</row></table格式的xml文件
本来打算用ArrayList装method的,可是后来发现 object.getClass().getDeclatrdMethods()返回的method数组每次排序都不同,于是改用map
第一版代码:
public class FirstSax1 {public static void main(String[] args) throws TransformerConfigurationException, SAXException {Book book = new Book("thinkinjava", "1111.1", "James Gosling", "1.1", "english");ArrayList<Book> listData = Lists.newArrayList(book,book,book,book,book,book);try {new FirstSax1().createXML(listData, new File("a.xml"));} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {e.printStackTrace();}}private void createXML(List<Book> listData,File file) throws TransformerConfigurationException, SAXException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{SAXTransformerFactory saxTransformerFactory = (SAXTransformerFactory) SAXTransformerFactory.newInstance();TransformerHandler transformerHandler = saxTransformerFactory.newTransformerHandler();transformerHandler = saxTransformerFactory.newTransformerHandler();Transformer transformer = transformerHandler.getTransformer();//是否换行transformer.setOutputProperty(OutputKeys.INDENT, "yes");//是否缩进transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");//是否忽略xml声明 transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");transformerHandler.setResult(new StreamResult(file));transformerHandler.startDocument();AttributesImpl attr = new AttributesImpl();transformerHandler.characters("\n".toCharArray(), 0, "\n".length());transformerHandler.startElement("","","table",attr);for(Book b:listData) {attr.clear();transformerHandler.startElement("", "", "row", attr);attr.clear();transformerHandler.startElement("", "", "name", attr);transformerHandler.characters(b.getName().toCharArray(), 0, b.getName().length());transformerHandler.endElement("", "", "name");attr.clear();transformerHandler.startElement("", "", "author", attr);transformerHandler.characters(b.getAuthor().toCharArray(), 0, b.getAuthor().length());transformerHandler.endElement("", "", "author"); attr.clear(); transformerHandler.startElement("", "", "price", attr); transformerHandler.characters(b.getPrice().toCharArray(), 0, b.getPrice().length()); transformerHandler.endElement("", "", "price"); attr.clear(); transformerHandler.startElement("", "", "version", attr); transformerHandler.characters(b.getVersion().toCharArray(), 0, b.getVersion().length()); transformerHandler.endElement("", "", "version"); attr.clear(); transformerHandler.startElement("", "", "language", attr); transformerHandler.characters(b.getLanguage().toCharArray(), 0, b.getLanguage().length()); transformerHandler.endElement("", "", "language"); transformerHandler.endElement("", "", "row");}transformerHandler.endElement("", "", "table");transformerHandler.endDocument();}}
改进后的:createXMl()
private void createXML(List<Book> listData,File file) throws TransformerConfigurationException, SAXException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{TransformerHandler transformerHandler;transformerHandler = SaxUtil.prepareTransformerHandler(file);if(transformerHandler == null) {return;}transformerHandler.startDocument();AttributesImpl attr = new AttributesImpl();transformerHandler.characters("\n".toCharArray(), 0, "\n".length());transformerHandler.startElement("","","table",attr);for(Book b:listData) {attr.clear();transformerHandler.startElement("", "", "row", attr);attr.clear();transformerHandler.startElement("", "", "name", attr);transformerHandler.characters(b.getName().toCharArray(), 0, b.getName().length());transformerHandler.endElement("", "", "name");SaxUtil.addAFullElement(transformerHandler,"author",attr,b.getAuthor());SaxUtil.addAFullElement(transformerHandler,"price",attr,b.getPrice()); SaxUtil.addAFullElement(transformerHandler,"version",attr,b.getVersion()); SaxUtil.addAFullElement(transformerHandler,"language",attr,b.getLanguage()); transformerHandler.endElement("", "", "row");}transformerHandler.endElement("", "", "table");transformerHandler.endDocument();}
Util:
public class SaxUtil {public static TransformerHandler prepareTransformerHandler(File file) {SAXTransformerFactory saxTransformerFactory = (SAXTransformerFactory) SAXTransformerFactory.newInstance();TransformerHandler transformerHandler;try {transformerHandler = saxTransformerFactory.newTransformerHandler();Transformer transformer = transformerHandler.getTransformer();//是否换行transformer.setOutputProperty(OutputKeys.INDENT, "yes");//是否缩进transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");//是否忽略xml声明 transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");transformerHandler.setResult(new StreamResult(file));return transformerHandler;} catch (TransformerConfigurationException e) {e.printStackTrace();return null;}}public static void addAFullElement(TransformerHandler transformerHandler, String qName, AttributesImpl attr,String valueString){attr.clear();try {transformerHandler.startElement("", "", qName, attr);transformerHandler.characters(valueString.toCharArray(), 0, valueString.length());transformerHandler.endElement("", "", qName);} catch (SAXException e) {e.printStackTrace();}}}
贴代码好 XX 麻烦啊 直接上最终的.
private void createXML(List<Book> listData,File file) throws TransformerConfigurationException, SAXException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{TransformerHandler transformerHandler;transformerHandler = SaxUtil.prepareTransformerHandler(file);if(transformerHandler == null) {return;}transformerHandler.startDocument();AttributesImpl attr = new AttributesImpl();transformerHandler.characters("\n".toCharArray(), 0, "\n".length());transformerHandler.startElement("","","table",attr);List<String> nameList = ReflectUtil.getObjectFiledName(listData.get(0));Iterator<String> iterator = null;Map<String, Method> methodMap = null;String qname = null;String valueString = null;for(Book b:listData) {iterator = nameList.iterator();methodMap = ReflectUtil.getObjectMethod(b);attr.clear();transformerHandler.startElement("", "", "row", attr);while (iterator.hasNext()) {qname = iterator.next();valueString = (String) methodMap.get(qname).invoke(b);SaxUtil.addAFullElement(transformerHandler,qname,attr,valueString);} transformerHandler.endElement("", "", "row");}transformerHandler.endElement("", "", "table");transformerHandler.endDocument();}
ReflectUtil:
public class ReflectUtil {public static <T> List<String> getObjectFiledName(T object) {ArrayList<String> nameList = Lists.newArrayList();Field[] declaredFields = object.getClass().getDeclaredFields();for (Field f : declaredFields) {nameList.add(f.getName());}return nameList;}public static <T> Map<String,Method> getObjectMethod(T object) {HashMap<String, Method> methodMap = Maps.newHashMap();Method[] methods = object.getClass().getDeclaredMethods();for(Method m:methods) {if(m.getName().startsWith("get")) {methodMap.put(m.getName().replaceAll("get", "").toLowerCase(), m);}}return methodMap;}}
本来打算用ArrayList装method的,可是后来发现 object.getClass().getDeclatrdMethods()返回的method数组每次排序都不同,于是改用map
阅读全文
1 0
- SAX写入xml 与 封装
- SAX方式写入XML文件
- sax封装xml文档数据
- SAX对xml的解析,javabean封装
- sax解析并封装XML到bean
- sax解析并封装XMl到bean
- SAX解析XML并封装到对象
- SAX与DOM解析XML
- XML解析SAX与DOM
- 对SAX解析XML的几个封装方法
- XML 的 SAX 解析范例:将数据封装至javaBean
- sax解析案例(javabean封装xml文档数据)
- SAX将xml文档信息封装到对象中
- android中使用SAX解析xml(封装)
- XML封装与解析
- 读取与写入XML文件
- XML文件写入与读取
- Java与XML读写之SAX篇
- 费马小定理
- Java怎么继承java包下面的类
- 对象与Map的相互转换
- ArcGIS API for JS 中,三种查询方式
- SpringCloud项目的创建
- SAX写入xml 与 封装
- 关于jeecg 项目的莫名其妙的问题
- python多路分支用字典实现
- 每日英语阅读(七十)
- 【Tensorflow】 第二节 安装 Ubuntu16.04LTS 双系统
- Linux shell脚本中shift的用法说明
- 利用rem实现响应式布局
- html5用css3实现线性渐变background-image:linear-gradient使用方法
- 前后端分离。前端POST请求参数过长,导致400错误解决办法及分析