`

DOM、SAX、DOM4J、JDOM、StAX生成XML并返回XML字符串形式(转自http://dreams75.iteye.com/blog/512319)

阅读更多
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);
	}

}

 

分享到:
评论

相关推荐

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

    下面将详细介绍这些解析器的工作原理以及它们在生成XML并返回XML字符串形式时的应用。 1. DOM (Document Object Model) DOM是一种基于树形结构的XML解析模型,它将整个XML文档加载到内存中,形成一个完整的文档对象...

    org.xml.sax.SAXException: Invalid element

    NULL 博文链接:https://wilian.iteye.com/blog/1992365

    dom4j解析XML文件格式

    DOM4j支持DOM、SAX、JAXP等多种XML解析方式,并内置了对XPath的支持,这使得开发人员能够轻松地进行XML文件的读取、写入以及查询等操作。 **环境搭建:** 1. **下载DOM4j库:** - 前往DOM4j官方网站或其他可信源...

    java操作xml dom dom4j sax jdom

    为了处理XML文档,Java提供了多种API,其中最常用的包括DOM、SAX、DOM4J和JDOM。以下是对这些方法的详细介绍: 1. DOM(Document Object Model) DOM是一种树形结构的API,它将整个XML文档加载到内存中,形成一个...

    生成、解析xml的四种方式(dom,dom4j,sax,jdom)

    本文将详细介绍生成和解析XML的四种主要方法:DOM、DOM4J、SAX和JDOM。 1. DOM(Document Object Model) DOM是W3C组织推荐的一种解析XML的标准方式。它将XML文档视为一个树形结构,每个节点代表XML文档的一部分。...

    使用dom4j和jaxen解析xml

    - **XPath查询**:dom4j支持XPath表达式,可以使用`XPath`接口进行查询。 - **修改XML**:直接操作`Element`、`Attribute`等对象,然后使用`Document`的`write()`方法保存更改。 2. **jaxen** 是一个独立于DOM...

    XML的四种解析器(dom,sax,jdom,dom4j)原理及性能比较,超详细

    常见的 XML 解析器有 DOM、SAX、JDOM 和 DOM4J 等。每种解析器都有其特点和优缺,选择合适的解析器对应用程序的性能和开发效率有很大影响。 1. DOM 解析器 DOM(Document Object Model)是 W3C 官方标准,用于表示...

    解析XML的四种JAR包jdom.jar、SAX.jar、dom4j.jar、dom.jar

    在Java编程中,解析XML文档是常见的需求,为此,有多种库可供选择,其中包括jdom.jar、SAX.jar、dom4j.jar和dom.jar。这些JAR包提供了不同的API和解析策略,各有优缺点。接下来,我们将深入探讨这四种XML解析器。 1...

    jdom.jar,dom4j.jar,dom.jar,sax.jar,jaxen.jar解析xmljar包

    为了处理XML文档,Java提供了多种API,其中包括JDOM、DOM4J、DOM、SAX和JAXEN。这些库分别代表了不同的解析策略,各有优缺点,适用于不同场景。下面将详细介绍这些库及其在解析XML时的角色。 首先,`jdom.jar` 是...

    解析XML所需的jar dom.jar dom4j.jar sax.jar jdom.jar

    解析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

    一写小例子,dom4J,dom,jdom,sax解析和创建XML文件,代码虽然简单,但是功能实现,适合入门

    本文将详细介绍四种主流的Java XML处理库:DOM4J、DOM、JDOM和SAX,并通过简单的代码示例帮助初学者入门。 1. DOM (Document Object Model) DOM是W3C制定的一种标准,它将XML文档视为一个树形结构,允许开发者通过...

    XML解析-dom4j.jar-jdom.jar

    在Java编程中,解析XML文档通常需要借助于特定的库,如dom4j和jdom。这两个库都是Java平台上处理XML的优秀选择。 dom4j是一个功能强大的开源XML处理库,提供了灵活且高效的API。它不仅支持DOM模型,还支持SAX...

    DOM、SAX、JDOM、DOM4J读写xml文档

    在Java中,有几种不同的API可以用来处理XML文档,包括DOM、SAX、JDOM和DOM4J。下面将详细介绍这四种方式。 **DOM(Document Object Model)** DOM是一种树形结构的API,它将整个XML文档加载到内存中,形成一个可...

    dom4j和jdom的jar包

    DOM4J和JDOM是两种常用的Java XML处理库,它们都是为了方便开发者解析、操作和创建XML文档。本文将深入探讨这两个库的核心概念、特点以及它们在处理XML时的异同。 首先,DOM4J是一个非常灵活且功能强大的Java XML ...

    用DOM SAX JDom dom4j 对xml文档解析实例

    本文将深入探讨DOM、SAX、JDom和dom4j四种流行的Java XML解析器,以及它们在处理XML文档时的特点和用法。 1. DOM(Document Object Model) DOM是W3C推荐的一种解析XML的标准方法。它将XML文档表示为一个树形结构,...

    XML四种解析方式------DOM SAX JDOM DOM4J

    在处理XML文档时,有多种解析方式,包括DOM、SAX、JDOM和DOM4J。每种解析方式都有其特性和适用场景,下面将详细探讨这四种解析方法。 1. DOM(Document Object Model) DOM解析器将整个XML文档加载到内存中,形成一...

    XML 文件解析 DOM DOM4j JDOM SAX 和相对路径的写法 ,代码是有注释的

    本教程将详细介绍四种主要的XML解析方式:DOM、DOM4j、JDOM和SAX,以及如何在Java中处理XML文件的相对路径。 1. DOM(Document Object Model) DOM是W3C推荐的一种解析XML的标准,它将XML文档转化为一个树形结构,...

    java xml 4 种 解析xml 方法 sax jdom dom stAX

    为了处理XML文档,Java提供了多种解析方法,包括SAX(Simple API for XML)、JDOM(Java Document Object Model)、DOM(Document Object Model)以及stAX(Streaming API for XML)。下面将详细介绍这四种解析XML的...

    java中四种操作(dom、sax、jdom、dom4j)xml方式详解与比较.txt )

    java中四种操作(dom、sax、jdom、dom4j)xml方式详解与

    dom4j-1.6.1.jar + jaxen-1.1.1.jar

    DOM4J支持多种XML处理模型,包括DOM(Document Object Model)、SAX(Simple API for XML)和STAX(Streaming API for XML)。由于DOM4J设计时考虑了性能和内存效率,因此在处理大型XML文件时,它通常比纯DOM模型更...

Global site tag (gtag.js) - Google Analytics