- 浏览: 169728 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
Sleyking:
很有帮助
DOM、SAX、DOM4J、JDOM、StAX生成XML并返回XML字符串形式 -
Sorry':
...
JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之比较 -
laihc035:
[color=green][/color]好
JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之比较 -
huqiji:
没 用 的
Javascript时间比较 -
cfanllm:
哈哈。。。。
Eclipse中设置java文件里的作者,日期等说明
本文用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
import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import javax.xml.transform.OutputKeys; import javax.xml.transform.Result; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.sax.SAXTransformerFactory; import javax.xml.transform.sax.TransformerHandler; import javax.xml.transform.stax.StAXSource; import javax.xml.transform.stream.StreamResult; import org.dom4j.DocumentFactory; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; import org.jdom.Document; import org.jdom.Element; import org.jdom.output.XMLOutputter; import org.w3c.dom.Node; import org.w3c.dom.Text; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; /** * DOM、SAX、DOM4J、JDOM、StAX生成XML,返回各种方式生成XML的字符串形式 * <p> * <cities><city><id>151</id><name>长沙市</name></city><city><id>152</id><name>永州市 </name></city></cities> * </p> * @author fzbtshy@163.com * */ public class CreateXMLText { /** * DOM方式生成XML * @param cityList * @return */ public String domToXml(List<City> list) { String xmlStr = null; try { if (null != list && !list.isEmpty()) { // 实例化DOM生成工厂 DocumentBuilderFactory dbf = DocumentBuilderFactory .newInstance(); // 由工厂实例化文档创建器 DocumentBuilder db = dbf.newDocumentBuilder(); // 由文档创建器实例化文档对象 org.w3c.dom.Document doc = db.newDocument(); // 文档对象创建一个根元素<cities> org.w3c.dom.Element cities = doc.createElement("cities"); doc.appendChild(cities); for (City po : list) { // 创建<cities>的子元素<city> org.w3c.dom.Element cityElt = doc.createElement ("city"); cities.appendChild(cityElt); // 创建<city>的子元素<id> org.w3c.dom.Element idElt = doc.createElement ("id"); cityElt.appendChild(idElt); // 创建子元素<id>的文本值 // 第一种方式 // Text idTxt = doc.createTextNode(String.valueOf (c.getId())); // idElt.appendChild(idTxt); // 第二种方式 idElt.setTextContent(String.valueOf(po.getId())); // 创建<city>的子元素<name> org.w3c.dom.Element nameElt = doc.createElement ("name"); cityElt.appendChild(nameElt); // 创建子元素<name>的文本值 Text nameTxt = doc.createTextNode(po.getName()); nameElt.appendChild(nameTxt); // nameElt.setTextContent(po.getName()); } xmlStr = getDomXml(doc); } } catch (ParserConfigurationException e) { e.printStackTrace(); } System.out.println("DOM:" + xmlStr); return xmlStr; } /** * 将org.w3c.dom.Document内容转化成String * * @param doc * @return */ private String getDomXml(Node doc) { String xmlStr = null; try { // 以 Document Object Model(DOM)树的形式充当转换 Source 树的持有者 DOMSource source = new DOMSource(doc); //用来生成XML文件 // 要生成文件需构造PrintWriter的writer, //DOM中这种方式name的值没有写进去,由于编码的问题 // PrintWriter writerXml = new PrintWriter(new FileOutputStream ("city-dom.xml")); //用OutputStreamWriter加了编码就OK了 PrintWriter writerXml = new PrintWriter(new OutputStreamWriter(new FileOutputStream("city-jdom.xml"),"utf-8")); Result resultXml = new StreamResult(writerXml); // 实现此接口的对象包含构建转换结果树所需的信息 // Result resultXml = new StreamResult(new FileOutputStream("city- dom.xml")); //用来得到XML字符串形式 // 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。 StringWriter writerStr = new StringWriter(); Result resultStr = new StreamResult(writerStr); // 此抽象类的实例能够将源树转换为结果树。 Transformer transformer = TransformerFactory.newInstance() .newTransformer(); // 设置编码 transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); // 是否缩进 transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // 将 XML Source 转换为 Result transformer.transform(source, resultXml); transformer.transform(source, resultStr); //获取XML字符串 xmlStr = writerStr.getBuffer().toString(); } catch (TransformerException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return xmlStr; } /** * SAX方式生成XML * * @param list * @return */ public String saxToXml(List<City> list) { String xmlStr = null; try { //用来生成XML文件 // 要生成文件需构造PrintWriter的writer // PrintWriter writerXml = new PrintWriter("city-sax.xml"); // Result resultXml = new StreamResult(writerXml); // 实现此接口的对象包含构建转换结果树所需的信息 Result resultXml = new StreamResult(new FileOutputStream("city- sax.xml")); //用来得到XML字符串形式 // 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串 StringWriter writerStr = new StringWriter(); // 构建转换结果树所需的信息。 Result resultStr = new StreamResult(writerStr); // 创建SAX转换工厂 SAXTransformerFactory sff = (SAXTransformerFactory) SAXTransformerFactory .newInstance(); // 转换处理器,侦听 SAX ContentHandler //解析事件,并将它们转换为结果树 Result TransformerHandler th = sff.newTransformerHandler(); // 将源树转换为结果树 Transformer transformer = th.getTransformer(); // 设置字符编码 transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); // 是否缩进 transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //设置与用于转换的此 TransformerHandler 关联的 Result //注:这两个th.setResult不能同时启用 // th.setResult(resultXml); th.setResult(resultStr); th.startDocument(); AttributesImpl attr = new AttributesImpl(); th.startElement("", "", "cities", attr); if (null != list && !list.isEmpty()) { for (int i = 0; i < list.size(); i++) { th.startElement("", "", "city", attr); th.startElement("", "", "id", attr); String id = String.valueOf(list.get(i).getId()); th.characters(id.toCharArray(), 0, id.length()); th.endElement("", "", "id"); th.startElement("", "", "name", attr); String name = String.valueOf(list.get(i).getName ()); th.characters(name.toCharArray(), 0, name.length ()); th.endElement("", "", "name"); th.endElement("", "", "city"); } } th.endElement("", "", "cities"); th.endDocument(); xmlStr = writerStr.getBuffer().toString(); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } System.out.println("SAX:" + xmlStr); return xmlStr; } /** * StAX生成XML,它是The Streaming API for XML简称 * JDK1.6的新增 * @param list * @return */ public String stAXToXml( List<City> list ){ String xmlStr = null; try { if (null != list && !list.isEmpty()) { StringWriter writerStr = new StringWriter(); PrintWriter writerXml = new PrintWriter(new OutputStreamWriter(new FileOutputStream("city-StAX.xml"),"utf-8")); //定义用于获取 XMLEventWriter 和 XMLStreamWriter 的工厂抽象实现 XMLOutputFactory xof = XMLOutputFactory.newInstance(); //指定如何写XML,注:以下两行只能启用一行 // XMLStreamWriter xmlsw = xof.createXMLStreamWriter (writerStr); XMLStreamWriter xmlsw = xof.createXMLStreamWriter (writerXml); //写入XML文档声明 xmlsw.writeStartDocument("UTF-8", "1.0"); xmlsw.writeStartElement("cities"); // 写入注释到xml文档 xmlsw.writeComment("省和城市信息"); for (City po : list) { xmlsw.writeStartElement("city"); //添加<id>节点 xmlsw.writeStartElement("id"); xmlsw.writeCharacters(String.valueOf(po.getId())); // 结束<id>节点 xmlsw.writeEndElement(); //添加<name>节点 xmlsw.writeStartElement("name"); xmlsw.writeCharacters(po.getName()); // 结束<name>节点 xmlsw.writeEndElement(); xmlsw.writeEndElement(); } // 结束<cities>节点 xmlsw.writeEndElement(); // 结束 XML 文档 xmlsw.writeEndDocument(); xmlsw.flush(); xmlsw.close(); xmlStr = writerStr.getBuffer().toString(); writerStr.close(); } } catch (XMLStreamException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("StAX:" + xmlStr ); return xmlStr; } /** * JDOM方式生成XML * * @param list * @return */ public String jdomToXml(List<City> list) { String xmlStr = null; try { // 创建文档根节点<cities> Element citiesElt = new Element("cities"); if (null != list && !list.isEmpty()) { for (City po : list) { // 创建子元素节点<city> Element cityElt = new Element("city"); // 创建子元素节点<id> Element idElt = new Element("id"); // 向元素<city>中添加子元素<id> cityElt.addContent(idElt); // 添加id文本 idElt.addContent(String.valueOf(po.getId())); // 创建元素节点<name> Element nameElt = new Element("name"); // 向元素<city>中添加子元素<name> cityElt.addContent(nameElt); // 添加name文本 nameElt.addContent(po.getName()); // 在文档根节点添加子节点<city> citiesElt.addContent(cityElt); } } Document doc = new Document(citiesElt); XMLOutputter out = new XMLOutputter(); //获得XML字符串形式 xmlStr = out.outputString(doc); //生成XML文件 PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream("city-jdom.xml"),"utf-8")); out.output(doc, writer); writer.flush(); writer.close(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("JDOM:" + xmlStr); return xmlStr; } /** * DOM4J生成XML * * @param list * @return */ public String dom4jToXml(List<City> list) { String strXml = null; try { if (null != list && !list.isEmpty()) { DocumentFactory df = DocumentFactory.getInstance(); // org.dom4j.Document doc = DocumentHelper.createDocument (); org.dom4j.Document doc = df.createDocument("UTF-8"); // 创建根节点 org.dom4j.Element citiesElt = doc.addElement("cities"); for (City po : list) { // 在节点<cities>下增加子节点<city> org.dom4j.Element cityElt = citiesElt.addElement ("city"); // 在节点<city>下增加子节点<id> org.dom4j.Element idElt = cityElt.addElement ("id"); idElt.addText(String.valueOf(po.getId())); // 在节点<city>下增加子节点<name> org.dom4j.Element nameElt = cityElt.addElement ("name"); nameElt.addText(po.getName()); } // 有样式(缩进)的写出 OutputFormat opf = OutputFormat.createPrettyPrint(); opf.setEncoding("UTF-8"); opf.setTrimText(true); //生成XML文件 XMLWriter xmlOut = new XMLWriter(new FileOutputStream ("city-dom4j.xml"), opf); xmlOut.write(doc); xmlOut.flush(); xmlOut.close(); //获取XML字符串形式 StringWriter writerStr = new StringWriter(); XMLWriter xmlw = new XMLWriter(writerStr, opf); xmlw.write(doc); strXml = writerStr.getBuffer().toString(); // 无样式的 // strXml = doc.asXML(); } } catch (IOException e) { e.printStackTrace(); } System.out.println("DOM4J:" + strXml); return strXml; } public static void main(String[] args) throws Exception { List<City> list = City.getCityList(101L); CreateXMLText xml = new CreateXMLText(); xml.domToXml(list); xml.saxToXml(list); xml.stAXToXml(list); xml.dom4jToXml(list); xml.jdomToXml(list); } }
依赖的JAVABEAN对象City.java
import java.util.ArrayList; import java.util.List; public class City { // 主键 private Long id; // parentId为0代表是省份,否则为城市 private Long parentId; // 名字 private String name; // City对象列表 private List<City> citys; /** * 默认构造器 */ public City() { } /** * @param id * @param parentId * @param name */ public City(Long id, Long parentId, String name) { super(); this.id = id; this.parentId = parentId; this.name = name; } /** * @return the id */ public Long getId() { return id; } /** * @param id * the id to set */ public void setId(Long id) { this.id = id; } /** * @return the parentId */ public Long getParentId() { return parentId; } /** * @param parentId * the parentId to set */ public void setParentId(Long parentId) { this.parentId = parentId; } /** * @return the name */ public String getName() { return name; } /** * @param name * the name to set */ public void setName(String name) { this.name = name; } /** * @return the citys */ public List<City> getCitys() { return citys; } /** * @param citys * the citys to set */ public void setCitys(List<City> citys) { this.citys = citys; } @Override public String toString() { return "id=" + this.id + ",parentId=" + this.parentId + ",name=" + this.name; } /** * 测试用 获取省份 * * @return */ public static List<City> getProvinceList() { List<City> provinceList = new ArrayList<City>(); City city = new City(101L, 0L, "湖南省"); provinceList.add(city); city = new City(102L, 0L, "广东省"); provinceList.add(city); city = new City(103L, 0L, "浙江省"); provinceList.add(city); return provinceList; } /** * 测试用 获取城市 * * @return */ public static List<City> getCityList(Long provinceId) { List<City> cityList = new ArrayList<City>(); City city = null; // 编写湖南的城市 if (provinceId.equals(101L)) { city = new City(151L, 101L, "长沙市"); cityList.add(city); city = new City(152L, 101L, "永州市"); cityList.add(city); city = new City(153L, 101L, "衡阳市"); cityList.add(city); city = new City(154L, 101L, "郴州市"); cityList.add(city); city = new City(155L, 101L, "常德市"); cityList.add(city); } else if (provinceId.equals(102L)) { // 编写广东的城市 city = new City(171L, 102L, "广州市"); cityList.add(city); city = new City(172L, 102L, "深圳市"); cityList.add(city); city = new City(173L, 102L, "东莞市"); cityList.add(city); city = new City(174L, 102L, "中山市"); cityList.add(city); city = new City(175L, 102L, "佛山市"); cityList.add(city); city = new City(176L, 102L, "江门市"); cityList.add(city); } else if (provinceId.equals(103L)) { // 编写浙江的城市 city = new City(191L, 103L, "杭州市"); cityList.add(city); city = new City(192L, 103L, "宁波市"); cityList.add(city); } return cityList; } public static void main(String[] args) { List<City> province = City.getProvinceList(); for (City p : province) { System.out.println(p); } List<City> city = City.getCityList(101L); for (City c : city) { System.out.println(c); } } }
找JAR包:www.findjar.com
- dom4j_jdom相关jar包.rar (423 KB)
- 下载次数: 123
发表评论
-
[转载]Java异常总结
2010-05-22 22:16 1139本文重在Java中异常 ... -
(转载)关于Java栈与堆的思考
2010-05-22 22:09 9031. 栈(stack)与堆(heap)都是Java用来在Ram ... -
JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之比较
2009-11-11 10:38 8592JAVA解析XML的方式DOM、SAX ... -
JDK 6.0中基于StAX分析XML数据
2009-11-08 16:19 1202转自:http://hi.baidu.com/1sho ... -
System.getProperty()参数
2009-10-11 01:02 1196通过代码System.getProperties().list ... -
三种将配置文件读取为InputStream的方法
2009-09-29 23:45 2084类名:SequenceReader.java privat ... -
java验证身份证号码及编码规则和提取相应信息
2009-09-25 21:14 6485身份证前6位【ABCDEF】为 ... -
java压缩文件
2009-08-18 16:21 2393结合我前面发表一篇文件过滤器,在指定目录下搜索符合条件的文件后 ... -
多扩展名文件过滤器FilenameFilter
2009-08-14 17:09 1576public class OnlyExtendName i ...
相关推荐
XML解析四种解析方式 DOM SAX JDOM DOM4J
用DOM SAX JDom dom4j 对xml文档解析实例 在学习孙鑫老师视频教程,自己照着敲的源码,希望对大家有帮助
4种最主流、最全面、最详细的生成和解析xml的4种方式,包括Dom,Dom4j,Sax,JDom,读懂了绝对好用xml,非常好的入门项目,而且精心排版,逻辑清晰
java 解析xml 方法 sax jdom dom stAX
用用4中方式(dom4j、jdom、dom、sax)解析xml
java中四种操作(dom、sax、jdom、dom4j)xml方式详解与
java四种xml解析实例和jar包,包括dom,sax,dom4j,jdom等方式 java四种xml解析实例和jar包,包括dom,sax,dom4j,jdom等方式 是学习Java的xml解析的好例子,包括相应的dom4j.jar,jdom.jar等,自己整理的,物超所值啊,...
Java 四种方式操作xml,包括xml,dom,sax,jdom这四种方式的一个简单例子。
xml doc sax jdom dom4j完全讲解xml doc sax jdom dom4j完全讲解 xml doc sax jdom dom4j完全讲解 xml doc sax jdom dom4j完全讲解 xml doc sax jdom dom4j完全讲解 xml doc sax jdom dom4j完全讲解 xml doc sax ...
XML的四种解析器(dom,sax,jdom,dom4j)原理及性能比较,超详细XML的四种解析器原理及性能比较,超详细
总结DOM、SAX、JDOM、DOM4J读写xml文档的多种方法。
项目下包含dom4j的包 是里用dom4j的sax解析方式 sax解析打文件比dom速度快,该项目为测试项目
对于xml&dom&sax&dom4j 文件解析的代码总结
有四种方法 DOM DOM4j JDOM SAX 和相对路径的写法 ,代码是有注释的,通用型的……应该对大家有帮助
Java解析XML汇总DOM_SAX_JDOM_DOM4j_XPath 实例
xml 三种解析方式dom,sax,dom4j 内涵jar包,xml我默认放在本地D盘的。 三种方式的代码,我自己看别人代码总结。
解析XML所需的jar dom.jar dom4j-1.6.1.jar dom4j-2.0.2.jar dom4j-2.1.1.jar sax-2.0.1.jar jdom-2.0.6.jar 注意:dom4j-2.1.1.jar需要jdk8
解析XML的dom、sax和dom4j的jar包。解析XML的dom、sax和dom4j的jar包。
现在流行的几种解析xml的方法,都做了相应的创建和解析XML的demo,虽然有点简单,但是和新手入门