- 浏览: 173598 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
Sleyking:
很有帮助
DOM、SAX、DOM4J、JDOM、StAX生成XML并返回XML字符串形式 -
Sorry':
<table class="bbcode&qu ...
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 1180本文重在Java中异常 ... -
(转载)关于Java栈与堆的思考
2010-05-22 22:09 9541. 栈(stack)与堆(heap)都是Java用来在Ram ... -
JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之比较
2009-11-11 10:38 8658JAVA解析XML的方式DOM、SAX ... -
JDK 6.0中基于StAX分析XML数据
2009-11-08 16:19 1245转自:http://hi.baidu.com/1sho ... -
System.getProperty()参数
2009-10-11 01:02 1229通过代码System.getProperties().list ... -
三种将配置文件读取为InputStream的方法
2009-09-29 23:45 2147类名:SequenceReader.java privat ... -
java验证身份证号码及编码规则和提取相应信息
2009-09-25 21:14 6552身份证前6位【ABCDEF】为 ... -
java压缩文件
2009-08-18 16:21 2434结合我前面发表一篇文件过滤器,在指定目录下搜索符合条件的文件后 ... -
多扩展名文件过滤器FilenameFilter
2009-08-14 17:09 1637public class OnlyExtendName i ...
相关推荐
2. **DOM4J**:DOM4J是另一个流行的Java XML解析库,它不仅支持DOM,还支持SAX和StAX解析。DOM4J提供了更为灵活的API,可以方便地进行XML的读写操作。以下是一个使用DOM4J读取XML文档的例子: ```java ...
在这个场景中,我们关注的是如何使用DOM4J以String的形式读取XML内容,然后将String的值赋给XML中的特定节点,最后将更新后的内容写回XML文件。下面我们将详细探讨这一过程。 1. **解析XML到String** 要将XML文件...
4. 将DOM、JDOM或DOM4J对象序列化为XML字符串。 5. 从XML字符串反序列化回DOM、JDOM或DOM4J对象。 通过对这些知识点的深入理解和实践,你将能够熟练地在Java项目中处理XML数据。继续学习和探索,不断提升对XML解析...
- 保存修改:使用`TransformerFactory`和`Transformer`将修改后的DOM树转换回XML字符串或写入文件。 2. **JDOM实例**: - 创建XML文档:使用`Element`类创建根元素,然后添加子元素。 - 读取XML:`SAXBuilder`...
5. 写回XML:如果需要修改后的XML保存回文件,可以使用`XMLWriter`类将`Document`对象转换为字符串并写入文件。 DOM4J的优点包括其高效性(尤其是在处理大型XML文件时)、丰富的API以及对XPath的支持。然而,对于...
2. **SAX和StAX支持**:除了DOM,DOM4J还支持事件驱动的SAX和流式的StAX解析模型,这些模型在处理大型XML文件时特别有用,因为它们不需要将整个文档加载到内存中。 3. **XPath支持**:DOM4J内置了XPath支持,这使得...
标题中的“jdom从数据库和xml拿数据生成xml”指的是使用Java DOM(JDOM)库来处理XML数据,包括从数据库获取数据并将其转化为XML格式,以及从已有的XML文件中提取信息。JDOM是一个纯Java的XML API,它提供了一种高效...
在实际项目中,生成XML文件通常涉及到构建Document对象,添加Element、Attribute等节点,然后使用Transformer将Document对象转换成XML字符串或直接写入文件。解析XML时,你可以通过解析器读取文件,然后遍历Element...
1. DOM4J简介:DOM4J是一个开源的Java库,基于DOM、SAX和JDOM设计,它提供了一种灵活且高效的API来处理XML文档。DOM4J支持XPath和XSLT,可以方便地进行XML文档的构建、解析和修改。 2. XML文档结构:XML是一种可...
【DOM4J解析XML】 DOM4J是一个Java库,它提供了强大的XML处理...在实际开发中,根据项目需求和性能考虑,可以选择DOM4J或其他XML处理库,如JDOM、SAX或者StaX。理解DOM4J的工作原理和API,对于处理XML文档至关重要。
DOM4J支持SAX和DOM解析,同时也提供了StAX和JDOM的接口。 1. **DOM解析**: DOM4J可以解析XML文件,构建一个文档对象模型,允许开发者遍历、修改和创建XML结构。 2. **XPath支持**: DOM4J提供了XPath表达式的支持,...
2. **XPath支持**:DOM4J内置了XPath表达式引擎,允许开发者通过简单的字符串查询XML文档的任意部分。 3. **XML Schema支持**:DOM4J支持XML Schema,可用于验证XML文档是否符合特定的结构定义。 4. **事件驱动处理*...
4. 输出XML,使用`XMLOutputter`类将`Document`对象转换为字符串或写入文件。 **示例代码** ```java import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.input.SAXBuilder; import org.jdom2...
DOM4J 提供了将XML文档转换为其他格式(如HTML、DOM或SAX事件)的能力,以及将XML对象序列化为字符串或写入文件的功能。这使得在不同的XML处理技术之间进行数据交换变得简单。 **5. 编辑与修改** DOM4J 为XML文档...
1. **XML解析**:DOM4J支持多种解析方式,包括DOM、SAX和STAX,允许开发者根据需求选择最适合的解析策略。 2. **DOM模型**:DOM4J提供了基于树结构的DOM模型,使开发者能够方便地创建、修改和查询XML文档。 3. **...
3. **强大的XPath支持**:DOM4J提供了强大的XPath表达式引擎,使得可以通过简单的字符串表达式来查找、选择和操作XML节点。 4. **文档建模**:DOM4J使用树形结构表示XML文档,这使得对XML结构的操作变得直观,例如...
dom4j 可以将 XML 文档对象序列化为字符串或写入文件,使用 `DocumentWriter` 或 `XMLWriter`。反之,也可以从字符串或文件反序列化为 XML 文档。 **八、与 JDOM 和 DOM 的比较** dom4j 相比 JDOM 提供了更多的功能...
- **StAX解析**:DOM4J也支持StAX(Streaming API for XML),允许在解析过程中进行事件处理,结合了SAX和DOM的优点。 3. **XPath支持** DOM4J内置了XPath支持,可以使用XPath表达式来快速定位XML文档中的节点,...
4. **XPath查询**:Dom4j支持XPath表达式,允许通过简洁的字符串快速定位XML文档中的特定节点。例如,`Element element = document.selectSingleNode("//elementName")`可以找到所有名为"elementName"的元素。 5. *...