SAX写入xml 与 封装

来源:互联网 发布:手机越狱软件下载 编辑:程序博客网 时间:2024/06/05 17:17

需求:将List<Book>对象转换成<table> <row>  <属性名>value </属性名>....</row></table格式的xml文件

第一版代码:

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


 
原创粉丝点击