当前位置: 代码迷 >> 综合 >> DOM、SAX、DOM4J、JDOM、StAX生成XML并返回XML字符串形式
  详细解决方案

DOM、SAX、DOM4J、JDOM、StAX生成XML并返回XML字符串形式

热度:76   发布时间:2023-12-18 13:39:20.0

DOM、SAX、DOM4J、JDOM、StAX生成XML并返回XML字符串形式

展开

轉自:http://dreams75.iteye.com/blog/512319

本文用DOM、SAX、DOM4J、JDOM和JDK1.6中新增的StAX生成XML数据格式,并返回XML字符串形式。这里说一下StAX方式。
JDK6的新特性StAX(JSR 173)是JDK6.0中除了DOM和SAX之外的又一种处理XML文档的API
StAX的来历
在JAXP1.3(JSR 206)有两种处理XML文档的方法:DOM(Document Object Model)和SAX(Simple API forXML).由于JDK6.0中的JAXB2(JSR 222)和JAX-WS 2.0(JSR224)都会用到StAX所以Sun决定把StAX加入到JAXP家族当中来,并将JAXP的版本升级到1.4(JAXP1.4是JAXP1.3的维护版本),JDK6里面JAXP的版本就是1.4。
StAX是The Streaming API for XML的缩写,一种利用拉模式解析(pull-parsing)XML文档的API.StAX通过提供一种基于事件迭代器(Iterator)的API让程序员去控制xml文档解析过程,程序遍历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是程序促使解析器产生一个解析事件然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直到碰到文档结束符;SAX也是基于事件处理xml文档,但却是用推模式解析,解析器解析完整个xml文档后,才产生解析事件,然后推给程序去处理这些事件;DOM采用的方式是将整个xml文档映射到一颗内存树,这样就可以很容易地得到父节点和子结点以及兄弟节点的数据,但如果文档很大,将会严重影响性能。
CreateXMLText.java

Java代码
  1. import java.io.BufferedWriter;   
  2. import java.io.FileNotFoundException;   
  3. import java.io.FileOutputStream;   
  4. import java.io.FileWriter;   
  5. import java.io.IOException;   
  6. import java.io.OutputStreamWriter;   
  7. import java.io.PrintWriter;   
  8. import java.io.StringWriter;   
  9. import java.io.UnsupportedEncodingException;   
  10. import java.util.List;   
  11.   
  12. import javax.xml.parsers.DocumentBuilder;   
  13. import javax.xml.parsers.DocumentBuilderFactory;   
  14. import javax.xml.parsers.ParserConfigurationException;   
  15. import javax.xml.stream.XMLEventReader;   
  16. import javax.xml.stream.XMLOutputFactory;   
  17. import javax.xml.stream.XMLStreamException;   
  18. import javax.xml.stream.XMLStreamWriter;   
  19. import javax.xml.transform.OutputKeys;   
  20. import javax.xml.transform.Result;   
  21. import javax.xml.transform.Transformer;   
  22. import javax.xml.transform.TransformerConfigurationException;   
  23. import javax.xml.transform.TransformerException;   
  24. import javax.xml.transform.TransformerFactory;   
  25. import javax.xml.transform.dom.DOMSource;   
  26. import javax.xml.transform.sax.SAXTransformerFactory;   
  27. import javax.xml.transform.sax.TransformerHandler;   
  28. import javax.xml.transform.stax.StAXSource;   
  29. import javax.xml.transform.stream.StreamResult;   
  30.   
  31. import org.dom4j.DocumentFactory;   
  32. import org.dom4j.io.OutputFormat;   
  33. import org.dom4j.io.XMLWriter;   
  34. import org.jdom.Document;   
  35. import org.jdom.Element;   
  36. import org.jdom.output.XMLOutputter;   
  37. import org.w3c.dom.Node;   
  38. import org.w3c.dom.Text;   
  39. import org.xml.sax.SAXException;   
  40. import org.xml.sax.helpers.AttributesImpl;   
  41.   
  42. /**  
  43.  * DOM、SAX、DOM4J、JDOM、StAX生成XML,返回各种方式生成XML的字符串形式  
  44.  * <p>  
  45.  * <cities><city><id>151</id><name>长沙市</name></city><city><id>152</id><name>永州市  
  46.  
  47. </name></city></cities>  
  48.  * </p>  
  49.  * @author fzbtshy@163.com  
  50.  *  
  51.  */  
  52. public class CreateXMLText {   
  53.   
  54.     /**  
  55.      * DOM方式生成XML  
  56.      * @param cityList  
  57.      * @return  
  58.      */  
  59.     public String domToXml(List<City> list) {   
  60.         String xmlStr = null;   
  61.         try {   
  62.             if (null != list && !list.isEmpty()) {   
  63.   
  64.                 // 实例化DOM生成工厂   
  65.                 DocumentBuilderFactory dbf = DocumentBuilderFactory   
  66.                         .newInstance();   
  67.                 // 由工厂实例化文档创建器   
  68.                 DocumentBuilder db = dbf.newDocumentBuilder();   
  69.   
  70.                 // 由文档创建器实例化文档对象   
  71.                 org.w3c.dom.Document doc = db.newDocument();   
  72.                 // 文档对象创建一个根元素<cities>   
  73.                 org.w3c.dom.Element cities = doc.createElement("cities");   
  74.                 doc.appendChild(cities);   
  75.   
  76.                 for (City po : list) {   
  77.   
  78.                     // 创建<cities>的子元素<city>   
  79.                     org.w3c.dom.Element cityElt = doc.createElement   
  80.   
  81. ("city");   
  82.                     cities.appendChild(cityElt);   
  83.   
  84.                     // 创建<city>的子元素<id>   
  85.                     org.w3c.dom.Element idElt = doc.createElement   
  86.   
  87. ("id");   
  88.                     cityElt.appendChild(idElt);   
  89.   
  90.                     // 创建子元素<id>的文本值   
  91.                     // 第一种方式   
  92.                     // Text idTxt = doc.createTextNode(String.valueOf   
  93.   
  94. (c.getId()));   
  95.                     // idElt.appendChild(idTxt);   
  96.                     // 第二种方式   
  97.                     idElt.setTextContent(String.valueOf(po.getId()));   
  98.   
  99.                     // 创建<city>的子元素<name>   
  100.                     org.w3c.dom.Element nameElt = doc.createElement   
  101.   
  102. ("name");   
  103.                     cityElt.appendChild(nameElt);   
  104.   
  105.                     // 创建子元素<name>的文本值   
  106.                     Text nameTxt = doc.createTextNode(po.getName());   
  107.                     nameElt.appendChild(nameTxt);   
  108. //                  nameElt.setTextContent(po.getName());   
  109.   
  110.                 }   
  111.                 xmlStr = getDomXml(doc);   
  112.             }   
  113.         } catch (ParserConfigurationException e) {   
  114.             e.printStackTrace();   
  115.         }   
  116.         System.out.println("DOM:" + xmlStr);   
  117.         return xmlStr;   
  118.     }   
  119.   
  120.     /**  
  121.      * 将org.w3c.dom.Document内容转化成String  
  122.      *   
  123.      * @param doc  
  124.      * @return  
  125.      */  
  126.     private String getDomXml(Node doc) {   
  127.         String xmlStr = null;   
  128.         try {   
  129. // 以 Document Object Model(DOM)树的形式充当转换 Source 树的持有者   
  130.             DOMSource source = new DOMSource(doc);   
  131.                
  132.             //用来生成XML文件   
  133.                                // 要生成文件需构造PrintWriter的writer,   
  134. //DOM中这种方式name的值没有写进去,由于编码的问题   
  135. //          PrintWriter writerXml = new PrintWriter(new FileOutputStream   
  136.   
  137. ("city-dom.xml"));   
  138.             //用OutputStreamWriter加了编码就OK了   
  139.             PrintWriter writerXml = new PrintWriter(new OutputStreamWriter(new    
  140.   
  141. FileOutputStream("city-jdom.xml"),"utf-8"));   
  142.             Result resultXml = new StreamResult(writerXml);   
  143.             // 实现此接口的对象包含构建转换结果树所需的信息   
  144. //          Result resultXml = new StreamResult(new FileOutputStream("city-   
  145.   
  146. dom.xml"));   
  147.   
  148.             //用来得到XML字符串形式   
  149.     // 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。   
  150.             StringWriter writerStr = new StringWriter();   
  151.             Result resultStr = new StreamResult(writerStr);   
  152.                
  153.             // 此抽象类的实例能够将源树转换为结果树。   
  154.             Transformer transformer = TransformerFactory.newInstance()   
  155.                     .newTransformer();   
  156.             // 设置编码   
  157.             transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");   
  158.             // 是否缩进   
  159.             transformer.setOutputProperty(OutputKeys.INDENT, "yes");   
  160.             // 将 XML Source 转换为 Result   
  161.             transformer.transform(source, resultXml);   
  162.             transformer.transform(source, resultStr);   
  163.   
  164.             //获取XML字符串   
  165.             xmlStr = writerStr.getBuffer().toString();   
  166.         } catch (TransformerException e) {   
  167.             e.printStackTrace();   
  168.         } catch (Exception e) {   
  169.             e.printStackTrace();   
  170.         }   
  171.         return xmlStr;   
  172.     }   
  173.   
  174.     /**  
  175.      * SAX方式生成XML  
  176.      *   
  177.      * @param list  
  178.      * @return  
  179.      */  
  180.     public String saxToXml(List<City> list) {   
  181.         String xmlStr = null;   
  182.         try {   
  183.             //用来生成XML文件   
  184.             // 要生成文件需构造PrintWriter的writer   
  185. //          PrintWriter writerXml = new PrintWriter("city-sax.xml");   
  186. //          Result resultXml = new StreamResult(writerXml);   
  187.             // 实现此接口的对象包含构建转换结果树所需的信息   
  188.             Result resultXml = new StreamResult(new FileOutputStream("city-   
  189.   
  190. sax.xml"));   
  191.                
  192.             //用来得到XML字符串形式   
  193.     // 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串   
  194.             StringWriter writerStr = new StringWriter();   
  195.             // 构建转换结果树所需的信息。   
  196.             Result resultStr = new StreamResult(writerStr);   
  197.                
  198.             // 创建SAX转换工厂   
  199.             SAXTransformerFactory sff = (SAXTransformerFactory)    
  200.   
  201. SAXTransformerFactory   
  202.                     .newInstance();   
  203.             // 转换处理器,侦听 SAX ContentHandler    
  204. //解析事件,并将它们转换为结果树 Result   
  205.             TransformerHandler th = sff.newTransformerHandler();   
  206.             // 将源树转换为结果树   
  207.             Transformer transformer = th.getTransformer();   
  208.             // 设置字符编码   
  209.             transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");   
  210.             // 是否缩进   
  211.              transformer.setOutputProperty(OutputKeys.INDENT, "yes");   
  212.                 
  213.         //设置与用于转换的此 TransformerHandler 关联的 Result   
  214.                   //注:这两个th.setResult不能同时启用   
  215. //          th.setResult(resultXml);            th.setResult(resultStr);   
  216.                
  217.             th.startDocument();   
  218.             AttributesImpl attr = new AttributesImpl();   
  219.             th.startElement("""""cities", attr);   
  220.             if (null != list && !list.isEmpty()) {   
  221.                 for (int i = 0; i < list.size(); i++) {   
  222.                     th.startElement("""""city", attr);   
  223.   
  224.                     th.startElement("""""id", attr);   
  225.                     String id = String.valueOf(list.get(i).getId());   
  226.                     th.characters(id.toCharArray(), 0, id.length());   
  227.                     th.endElement("""""id");   
  228.   
  229.                     th.startElement("""""name", attr);   
  230.                     String name = String.valueOf(list.get(i).getName   
  231.   
  232. ());   
  233.                     th.characters(name.toCharArray(), 0, name.length   
  234.   
  235. ());   
  236.                     th.endElement("""""name");   
  237.   
  238.                     th.endElement("""""city");   
  239.                 }   
  240.             }   
  241.   
  242.             th.endElement("""""cities");   
  243.             th.endDocument();   
  244.             xmlStr = writerStr.getBuffer().toString();   
  245.         } catch (TransformerConfigurationException e) {   
  246.             e.printStackTrace();   
  247.         } catch (SAXException e) {   
  248.             e.printStackTrace();   
  249.         } catch (Exception e) {   
  250.             e.printStackTrace();   
  251.         }   
  252.         System.out.println("SAX:" + xmlStr);   
  253.         return xmlStr;   
  254.     }   
  255.   
  256.     /**  
  257.      * StAX生成XML,它是The Streaming API for XML简称  
  258.      * JDK1.6的新增  
  259.      * @param list  
  260.      * @return  
  261.      */  
  262.     public String stAXToXml( List<City> list ){   
  263.         String xmlStr = null;   
  264.         try {   
  265.             if (null != list && !list.isEmpty()) {   
  266.                 StringWriter writerStr = new StringWriter();   
  267.                    
  268.                 PrintWriter writerXml = new PrintWriter(new    
  269.   
  270. OutputStreamWriter(new FileOutputStream("city-StAX.xml"),"utf-8"));   
  271.                    
  272. //定义用于获取 XMLEventWriter 和 XMLStreamWriter 的工厂抽象实现   
  273.                 XMLOutputFactory xof = XMLOutputFactory.newInstance();   
  274.         //指定如何写XML,注:以下两行只能启用一行   
  275. //              XMLStreamWriter xmlsw = xof.createXMLStreamWriter   
  276.   
  277. (writerStr);   
  278.                 XMLStreamWriter xmlsw = xof.createXMLStreamWriter   
  279.   
  280. (writerXml);   
  281.                    
  282.                 //写入XML文档声明   
  283.                 xmlsw.writeStartDocument("UTF-8""1.0");   
  284.                 xmlsw.writeStartElement("cities");   
  285.                 // 写入注释到xml文档   
  286.                 xmlsw.writeComment("省和城市信息");   
  287.                 for (City po : list) {   
  288.                     xmlsw.writeStartElement("city");   
  289.                     //添加<id>节点   
  290.                     xmlsw.writeStartElement("id");   
  291.                     xmlsw.writeCharacters(String.valueOf(po.getId()));   
  292.                     // 结束<id>节点   
  293.                     xmlsw.writeEndElement();   
  294.                     //添加<name>节点   
  295.                     xmlsw.writeStartElement("name");   
  296.                     xmlsw.writeCharacters(po.getName());   
  297.                     // 结束<name>节点   
  298.                     xmlsw.writeEndElement();   
  299.                        
  300.                     xmlsw.writeEndElement();   
  301.                 }   
  302.                 // 结束<cities>节点   
  303.                 xmlsw.writeEndElement();   
  304.                 // 结束 XML 文档   
  305.                 xmlsw.writeEndDocument();   
  306.                 xmlsw.flush();   
  307.                 xmlsw.close();   
  308.                    
  309.                 xmlStr = writerStr.getBuffer().toString();   
  310.                 writerStr.close();   
  311.             }   
  312.         } catch (XMLStreamException e) {   
  313.             e.printStackTrace();   
  314.         } catch (IOException e) {   
  315.             e.printStackTrace();   
  316.         }   
  317.         System.out.println("StAX:" + xmlStr  );   
  318.         return xmlStr;   
  319.     }   
  320.        
  321.     /**  
  322.      * JDOM方式生成XML  
  323.      *   
  324.      * @param list  
  325.      * @return  
  326.      */  
  327.     public String jdomToXml(List<City> list) {   
  328.         String xmlStr = null;   
  329.         try {   
  330.             // 创建文档根节点<cities>   
  331.             Element citiesElt = new Element("cities");   
  332.             if (null != list && !list.isEmpty()) {   
  333.                 for (City po : list) {   
  334.                     // 创建子元素节点<city>   
  335.                     Element cityElt = new Element("city");   
  336.                     // 创建子元素节点<id>   
  337.                     Element idElt = new Element("id");   
  338.                     // 向元素<city>中添加子元素<id>   
  339.                     cityElt.addContent(idElt);   
  340.                     // 添加id文本   
  341.                     idElt.addContent(String.valueOf(po.getId()));   
  342.        
  343.                     // 创建元素节点<name>   
  344.                     Element nameElt = new Element("name");   
  345.                     // 向元素<city>中添加子元素<name>   
  346.                     cityElt.addContent(nameElt);   
  347.                     // 添加name文本   
  348.                     nameElt.addContent(po.getName());   
  349.        
  350.                     // 在文档根节点添加子节点<city>   
  351.                     citiesElt.addContent(cityElt);   
  352.                 }   
  353.             }   
  354.                
  355.             Document doc = new Document(citiesElt);   
  356.             XMLOutputter out = new XMLOutputter();   
  357.             //获得XML字符串形式   
  358.             xmlStr = out.outputString(doc);   
  359.                
  360.             //生成XML文件   
  361.             PrintWriter writer = new PrintWriter(new OutputStreamWriter(new    
  362.   
  363. FileOutputStream("city-jdom.xml"),"utf-8"));   
  364.                
  365.             out.output(doc, writer);   
  366.             writer.flush();   
  367.             writer.close();   
  368.                
  369.         } catch (UnsupportedEncodingException e) {   
  370.             e.printStackTrace();   
  371.         } catch (FileNotFoundException e) {   
  372.             e.printStackTrace();   
  373.         } catch (IOException e) {   
  374.             e.printStackTrace();   
  375.         }   
  376.         System.out.println("JDOM:" + xmlStr);   
  377.         return xmlStr;   
  378.     }   
  379.   
  380.     /**  
  381.      * DOM4J生成XML  
  382.      *   
  383.      * @param list  
  384.      * @return  
  385.      */  
  386.     public String dom4jToXml(List<City> list) {   
  387.         String strXml = null;   
  388.         try {   
  389.             if (null != list && !list.isEmpty()) {   
  390.                 DocumentFactory df = DocumentFactory.getInstance();   
  391.                 // org.dom4j.Document doc = DocumentHelper.createDocument   
  392.   
  393. ();   
  394.                 org.dom4j.Document doc = df.createDocument("UTF-8");   
  395.                 // 创建根节点   
  396.                 org.dom4j.Element citiesElt = doc.addElement("cities");   
  397.        
  398.                 for (City po : list) {   
  399.             // 在节点<cities>下增加子节点<city>   
  400.                     org.dom4j.Element cityElt = citiesElt.addElement   
  401.   
  402. ("city");   
  403.        
  404.             // 在节点<city>下增加子节点<id>   
  405.                     org.dom4j.Element idElt = cityElt.addElement   
  406.   
  407. ("id");   
  408.                     idElt.addText(String.valueOf(po.getId()));   
  409.        
  410.             // 在节点<city>下增加子节点<name>   
  411.                     org.dom4j.Element nameElt = cityElt.addElement   
  412.   
  413. ("name");   
  414.                     nameElt.addText(po.getName());   
  415.                 }   
  416.        
  417.                 // 有样式(缩进)的写出   
  418.                 OutputFormat opf = OutputFormat.createPrettyPrint();   
  419.                 opf.setEncoding("UTF-8");   
  420.                 opf.setTrimText(true);   
  421.                    
  422.                 //生成XML文件   
  423.                 XMLWriter xmlOut = new XMLWriter(new FileOutputStream   
  424.   
  425. ("city-dom4j.xml"), opf);   
  426.                 xmlOut.write(doc);   
  427.                 xmlOut.flush();   
  428.                 xmlOut.close();   
  429.                    
  430.                 //获取XML字符串形式   
  431.                 StringWriter writerStr = new StringWriter();   
  432.                 XMLWriter xmlw = new XMLWriter(writerStr, opf);   
  433.                 xmlw.write(doc);   
  434.                 strXml = writerStr.getBuffer().toString();   
  435.                    
  436.                 // 无样式的   
  437.     //          strXml = doc.asXML();   
  438.             }   
  439.         } catch (IOException e) {   
  440.             e.printStackTrace();   
  441.         }   
  442.         System.out.println("DOM4J:" + strXml);   
  443.         return strXml;   
  444.     }   
  445.   
  446.     public static void main(String[] args) throws Exception {   
  447.         List<City> list = City.getCityList(101L);   
  448.         CreateXMLText xml = new CreateXMLText();   
  449.         xml.domToXml(list);   
  450.         xml.saxToXml(list);   
  451.         xml.stAXToXml(list);   
  452.         xml.dom4jToXml(list);   
  453.         xml.jdomToXml(list);   
  454.     }   
  455.   
  456. }  

     
  1. import java.io.BufferedWriter;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileOutputStream;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. import java.io.OutputStreamWriter;
  7. import java.io.PrintWriter;
  8. import java.io.StringWriter;
  9. import java.io.UnsupportedEncodingException;
  10. import java.util.List;
  11. import javax.xml.parsers.DocumentBuilder;
  12. import javax.xml.parsers.DocumentBuilderFactory;
  13. import javax.xml.parsers.ParserConfigurationException;
  14. import javax.xml.stream.XMLEventReader;
  15. import javax.xml.stream.XMLOutputFactory;
  16. import javax.xml.stream.XMLStreamException;
  17. import javax.xml.stream.XMLStreamWriter;
  18. import javax.xml.transform.OutputKeys;
  19. import javax.xml.transform.Result;
  20. import javax.xml.transform.Transformer;
  21. import javax.xml.transform.TransformerConfigurationException;
  22. import javax.xml.transform.TransformerException;
  23. import javax.xml.transform.TransformerFactory;
  24. import javax.xml.transform.dom.DOMSource;
  25. import javax.xml.transform.sax.SAXTransformerFactory;
  26. import javax.xml.transform.sax.TransformerHandler;
  27. import javax.xml.transform.stax.StAXSource;
  28. import javax.xml.transform.stream.StreamResult;
  29. import org.dom4j.DocumentFactory;
  30. import org.dom4j.io.OutputFormat;
  31. import org.dom4j.io.XMLWriter;
  32. import org.jdom.Document;
  33. import org.jdom.Element;
  34. import org.jdom.output.XMLOutputter;
  35. import org.w3c.dom.Node;
  36. import org.w3c.dom.Text;
  37. import org.xml.sax.SAXException;
  38. import org.xml.sax.helpers.AttributesImpl;
  39. /**
  40. * DOM、SAX、DOM4J、JDOM、StAX生成XML,返回各种方式生成XML的字符串形式
  41. * <p>
  42. * <cities><city><id>151</id><name>长沙市</name></city><city><id>152</id><name>永州市
  43. </name></city></cities>
  44. * </p>
  45. * @author fzbtshy@163.com
  46. *
  47. */
  48. public class CreateXMLText {
  49. /**
  50. * DOM方式生成XML
  51. * @param cityList
  52. * @return
  53. */
  54. public String domToXml(List<City> list) {
  55. String xmlStr = null;
  56. try {
  57. if ( null != list && !list.isEmpty()) {
  58. // 实例化DOM生成工厂
  59. DocumentBuilderFactory dbf = DocumentBuilderFactory
  60. .newInstance();
  61. // 由工厂实例化文档创建器
  62. DocumentBuilder db = dbf.newDocumentBuilder();
  63. // 由文档创建器实例化文档对象
  64. org.w3c.dom.Document doc = db.newDocument();
  65. // 文档对象创建一个根元素<cities>
  66. org.w3c.dom.Element cities = doc.createElement( "cities");
  67. doc.appendChild(cities);
  68. for (City po : list) {
  69. // 创建<cities>的子元素<city>
  70. org.w3c.dom.Element cityElt = doc.createElement
  71. ( "city");
  72. cities.appendChild(cityElt);
  73. // 创建<city>的子元素<id>
  74. org.w3c.dom.Element idElt = doc.createElement
  75. ( "id");
  76. cityElt.appendChild(idElt);
  77. // 创建子元素<id>的文本值
  78. // 第一种方式
  79. // Text idTxt = doc.createTextNode(String.valueOf
  80. (c.getId()));
  81. // idElt.appendChild(idTxt);
  82. // 第二种方式
  83. idElt.setTextContent(String.valueOf(po.getId()));
  84. // 创建<city>的子元素<name>
  85. org.w3c.dom.Element nameElt = doc.createElement
  86. ( "name");
  87. cityElt.appendChild(nameElt);
  88. // 创建子元素<name>的文本值
  89. Text nameTxt = doc.createTextNode(po.getName());
  90. nameElt.appendChild(nameTxt);
  91. // nameElt.setTextContent(po.getName());
  92. }
  93. xmlStr = getDomXml(doc);
  94. }
  95. } catch (ParserConfigurationException e) {
  96. e.printStackTrace();
  97. }
  98. System.out.println( "DOM:" + xmlStr);
  99. return xmlStr;
  100. }
  101. /**
  102. * 将org.w3c.dom.Document内容转化成String
  103. *
  104. * @param doc
  105. * @return
  106. */
  107. private String getDomXml(Node doc) {
  108. String xmlStr = null;
  109. try {
  110. // 以 Document Object Model(DOM)树的形式充当转换 Source 树的持有者
  111. DOMSource source = new DOMSource(doc);
  112. //用来生成XML文件
  113. // 要生成文件需构造PrintWriter的writer,
  114. //DOM中这种方式name的值没有写进去,由于编码的问题
  115. // PrintWriter writerXml = new PrintWriter(new FileOutputStream
  116. ( "city-dom.xml"));
  117. //用OutputStreamWriter加了编码就OK了
  118. PrintWriter writerXml = new PrintWriter( new OutputStreamWriter( new
  119. FileOutputStream( "city-jdom.xml"), "utf-8"));
  120. Result resultXml = new StreamResult(writerXml);
  121. // 实现此接口的对象包含构建转换结果树所需的信息
  122. // Result resultXml = new StreamResult(new FileOutputStream("city-
  123. dom.xml "));
  124. //用来得到XML字符串形式
  125. // 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。
  126. StringWriter writerStr = new StringWriter();
  127. Result resultStr = new StreamResult(writerStr);
  128. // 此抽象类的实例能够将源树转换为结果树。
  129. Transformer transformer = TransformerFactory.newInstance()
  130. .newTransformer();
  131. // 设置编码
  132. transformer.setOutputProperty(OutputKeys.ENCODING, "UTF- 8 ");
  133. // 是否缩进
  134. transformer.setOutputProperty(OutputKeys.INDENT, "yes ");
  135. // 将 XML Source 转换为 Result
  136. transformer.transform(source, resultXml);
  137. transformer.transform(source, resultStr);
  138. //获取XML字符串
  139. xmlStr = writerStr.getBuffer().toString();
  140. } catch (TransformerException e) {
  141. e.printStackTrace();
  142. } catch (Exception e) {
  143. e.printStackTrace();
  144. }
  145. return xmlStr;
  146. }
  147. /**
  148. * SAX方式生成XML
  149. *
  150. * @param list
  151. * @return
  152. */
  153. public String saxToXml(List<City> list) {
  154. String xmlStr = null;
  155. try {
  156. //用来生成XML文件
  157. // 要生成文件需构造PrintWriter的writer
  158. // PrintWriter writerXml = new PrintWriter("city-sax.xml ");
  159. // Result resultXml = new StreamResult(writerXml);
  160. // 实现此接口的对象包含构建转换结果树所需的信息
  161. Result resultXml = new StreamResult(new FileOutputStream("city-
  162. sax.xml "));
  163. //用来得到XML字符串形式
  164. // 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串
  165. StringWriter writerStr = new StringWriter();
  166. // 构建转换结果树所需的信息。
  167. Result resultStr = new StreamResult(writerStr);
  168. // 创建SAX转换工厂
  169. SAXTransformerFactory sff = (SAXTransformerFactory)
  170. SAXTransformerFactory
  171. .newInstance();
  172. // 转换处理器,侦听 SAX ContentHandler
  173. //解析事件,并将它们转换为结果树 Result
  174. TransformerHandler th = sff.newTransformerHandler();
  175. // 将源树转换为结果树
  176. Transformer transformer = th.getTransformer();
  177. // 设置字符编码
  178. transformer.setOutputProperty(OutputKeys.ENCODING, "UTF- 8 ");
  179. // 是否缩进
  180. transformer.setOutputProperty(OutputKeys.INDENT, "yes ");
  181. //设置与用于转换的此 TransformerHandler 关联的 Result
  182. //注:这两个th.setResult不能同时启用
  183. // th.setResult(resultXml); th.setResult(resultStr);
  184. th.startDocument();
  185. AttributesImpl attr = new AttributesImpl();
  186. th.startElement(" ", " ", "cities ", attr);
  187. if (null != list && !list.isEmpty()) {
  188. for (int i = 0; i < list.size(); i++) {
  189. th.startElement(" ", " ", "city ", attr);
  190. th.startElement(" ", " ", "id ", attr);
  191. String id = String.valueOf(list.get(i).getId());
  192. th.characters(id.toCharArray(), 0, id.length());
  193. th.endElement(" ", " ", "id ");
  194. th.startElement(" ", " ", "name ", attr);
  195. String name = String.valueOf(list.get(i).getName
  196. ());
  197. th.characters(name.toCharArray(), 0, name.length
  198. ());
  199. th.endElement(" ", " ", "name ");
  200. th.endElement(" ", " ", "city ");
  201. }
  202. }
  203. th.endElement(" ", " ", "cities ");
  204. th.endDocument();
  205. xmlStr = writerStr.getBuffer().toString();
  206. } catch (TransformerConfigurationException e) {
  207. e.printStackTrace();
  208. } catch (SAXException e) {
  209. e.printStackTrace();
  210. } catch (Exception e) {
  211. e.printStackTrace();
  212. }
  213. System.out.println("SAX: " + xmlStr);
  214. return xmlStr;
  215. }
  216. /**
  217. * StAX生成XML,它是The Streaming API for XML简称
  218. * JDK1.6的新增
  219. * @param list
  220. * @return
  221. */
  222. public String stAXToXml( List<City> list ){
  223. String xmlStr = null;
  224. try {
  225. if (null != list && !list.isEmpty()) {
  226. StringWriter writerStr = new StringWriter();
  227. PrintWriter writerXml = new PrintWriter(new
  228. OutputStreamWriter(new FileOutputStream("city-StAX.xml "),"utf- 8 "));
  229. //定义用于获取 XMLEventWriter 和 XMLStreamWriter 的工厂抽象实现
  230. XMLOutputFactory xof = XMLOutputFactory.newInstance();
  231. //指定如何写XML,注:以下两行只能启用一行
  232. // XMLStreamWriter xmlsw = xof.createXMLStreamWriter
  233. (writerStr);
  234. XMLStreamWriter xmlsw = xof.createXMLStreamWriter
  235. (writerXml);
  236. //写入XML文档声明
  237. xmlsw.writeStartDocument("UTF- 8 ", " 1.0 ");
  238. xmlsw.writeStartElement("cities ");
  239. // 写入注释到xml文档
  240. xmlsw.writeComment("省和城市信息 ");
  241. for (City po : list) {
  242. xmlsw.writeStartElement("city ");
  243. //添加<id>节点
  244. xmlsw.writeStartElement("id ");
  245. xmlsw.writeCharacters(String.valueOf(po.getId()));
  246. // 结束<id>节点
  247. xmlsw.writeEndElement();
  248. //添加<name>节点
  249. xmlsw.writeStartElement("name ");
  250. xmlsw.writeCharacters(po.getName());
  251. // 结束<name>节点
  252. xmlsw.writeEndElement();
  253. xmlsw.writeEndElement();
  254. }
  255. // 结束<cities>节点
  256. xmlsw.writeEndElement();
  257. // 结束 XML 文档
  258. xmlsw.writeEndDocument();
  259. xmlsw.flush();
  260. xmlsw.close();
  261. xmlStr = writerStr.getBuffer().toString();
  262. writerStr.close();
  263. }
  264. } catch (XMLStreamException e) {
  265. e.printStackTrace();
  266. } catch (IOException e) {
  267. e.printStackTrace();
  268. }
  269. System.out.println("StAX: " + xmlStr );
  270. return xmlStr;
  271. }
  272. /**
  273. * JDOM方式生成XML
  274. *
  275. * @param list
  276. * @return
  277. */
  278. public String jdomToXml(List<City> list) {
  279. String xmlStr = null;
  280. try {
  281. // 创建文档根节点<cities>
  282. Element citiesElt = new Element("cities ");
  283. if (null != list && !list.isEmpty()) {
  284. for (City po : list) {
  285. // 创建子元素节点<city>
  286. Element cityElt = new Element("city ");
  287. // 创建子元素节点<id>
  288. Element idElt = new Element("id ");
  289. // 向元素<city>中添加子元素<id>
  290. cityElt.addContent(idElt);
  291. // 添加id文本
  292. idElt.addContent(String.valueOf(po.getId()));
  293. // 创建元素节点<name>
  294. Element nameElt = new Element("name ");
  295. // 向元素<city>中添加子元素<name>
  296. cityElt.addContent(nameElt);
  297. // 添加name文本
  298. nameElt.addContent(po.getName());
  299. // 在文档根节点添加子节点<city>
  300. citiesElt.addContent(cityElt);
  301. }
  302. }
  303. Document doc = new Document(citiesElt);
  304. XMLOutputter out = new XMLOutputter();
  305. //获得XML字符串形式
  306. xmlStr = out.outputString(doc);
  307. //生成XML文件
  308. PrintWriter writer = new PrintWriter(new OutputStreamWriter(new
  309. FileOutputStream("city-jdom.xml "),"utf- 8 "));
  310. out.output(doc, writer);
  311. writer.flush();
  312. writer.close();
  313. } catch (UnsupportedEncodingException e) {
  314. e.printStackTrace();
  315. } catch (FileNotFoundException e) {
  316. e.printStackTrace();
  317. } catch (IOException e) {
  318. e.printStackTrace();
  319. }
  320. System.out.println("JDOM: " + xmlStr);
  321. return xmlStr;
  322. }
  323. /**
  324. * DOM4J生成XML
  325. *
  326. * @param list
  327. * @return
  328. */
  329. public String dom4jToXml(List<City> list) {
  330. String strXml = null;
  331. try {
  332. if (null != list && !list.isEmpty()) {
  333. DocumentFactory df = DocumentFactory.getInstance();
  334. // org.dom4j.Document doc = DocumentHelper.createDocument
  335. ();
  336. org.dom4j.Document doc = df.createDocument("UTF- 8 ");
  337. // 创建根节点
  338. org.dom4j.Element citiesElt = doc.addElement("cities ");
  339. for (City po : list) {
  340. // 在节点<cities>下增加子节点<city>
  341. org.dom4j.Element cityElt = citiesElt.addElement
  342. ("city ");
  343. // 在节点<city>下增加子节点<id>
  344. org.dom4j.Element idElt = cityElt.addElement
  345. ("id ");
  346. idElt.addText(String.valueOf(po.getId()));
  347. // 在节点<city>下增加子节点<name>
  348. org.dom4j.Element nameElt = cityElt.addElement
  349. ("name ");
  350. nameElt.addText(po.getName());
  351. }
  352. // 有样式(缩进)的写出
  353. OutputFormat opf = OutputFormat.createPrettyPrint();
  354. opf.setEncoding("UTF- 8 ");
  355. opf.setTrimText(true);
  356. //生成XML文件
  357. XMLWriter xmlOut = new XMLWriter(new FileOutputStream
  358. ("city-dom4j.xml "), opf);
  359. xmlOut.write(doc);
  360. xmlOut.flush();
  361. xmlOut.close();
  362. //获取XML字符串形式
  363. StringWriter writerStr = new StringWriter();
  364. XMLWriter xmlw = new XMLWriter(writerStr, opf);
  365. xmlw.write(doc);
  366. strXml = writerStr.getBuffer().toString();
  367. // 无样式的
  368. // strXml = doc.asXML();
  369. }
  370. } catch (IOException e) {
  371. e.printStackTrace();
  372. }
  373. System.out.println("DOM4J: " + strXml);
  374. return strXml;
  375. }
  376. public static void main(String[] args) throws Exception {
  377. List<City> list = City.getCityList(101L);
  378. CreateXMLText xml = new CreateXMLText();
  379. xml.domToXml(list);
  380. xml.saxToXml(list);
  381. xml.stAXToXml(list);
  382. xml.dom4jToXml(list);
  383. xml.jdomToXml(list);
  384. }
  385. }

依赖的JAVABEAN对象City.java
Java代码
  1. import java.util.ArrayList;   
  2. import java.util.List;   
  3.   
  4. public class City {   
  5.   
  6.     // 主键   
  7.     private Long id;   
  8.   
  9.     // parentId为0代表是省份,否则为城市   
  10.     private Long parentId;   
  11.   
  12.     // 名字   
  13.     private String name;   
  14.   
  15.     // City对象列表   
  16.     private List<City> citys;   
  17.   
  18.     /**  
  19.      * 默认构造器  
  20.      */  
  21.     public City() {   
  22.   
  23.     }   
  24.   
  25.     /**  
  26.      * @param id  
  27.      * @param parentId  
  28.      * @param name  
  29.      */  
  30.     public City(Long id, Long parentId, String name) {   
  31.         super();   
  32.         this.id = id;   
  33.         this.parentId = parentId;   
  34.         this.name = name;   
  35.     }   
  36.   
  37.     /**  
  38.      * @return the 
        <div class="person-messagebox"><div class="left-message"><a href="https://blog.csdn.net/sue8534091"><img src="https://profile.csdnimg.cn/2/4/B/3_sue8534091" class="avatar_pic" username="sue8534091"></a></div><div class="middle-message"><div class="title"><span class="tit vip-tit"><a href="https://blog.csdn.net/sue8534091" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;,&quot;ab&quot;:&quot;new&quot;}" target="_blank">sue8534091</a></span><!-- 等级,level --><img class="identity-icon" src="https://csdnimg.cn/identity/blog1.png">                                            </div><div class="text"><span>原创文章 16</span><span>获赞 0</span><span>访问量 421</span></div></div><div class="right-message"><a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;,&quot;ab&quot;:&quot;new&quot;,&quot;extend1&quot;:&quot;个人信息未关注&quot;}">关注</a><a href="https://im.csdn.net/im/main.html?userName=sue8534091" target="_blank" class="btn btn-sm bt-button personal-letter">私信</a></div></div></div>
</article>
  相关解决方案