Java——DOM方式生成XML (转)
http://blog.csdn.net/u012325167/article/details/50943202
使用DOM方式生成XML文件有如下几步:
首先是创建DOM树(即规定XML文件中的内容):
- 创建DocumentBuilderFactory对象
 - 通过DocumentBuilderFactory对象创建DocumentBuilder对象
 - 通过DocumentBuilder对象的newDocument()方法创建一个Document对象,该对象代表一个XML文件
 - 通过Document对象的createElement()方法创建根节点
 - 通过Document对象的createElement()方法创建N个子节点,并为他们赋值,再将这些子节点添加到根节点下
 - 将根节点添加到Document对象下
 
其次是将DOM树转换为XML文件:
- 创建TransformerFactory类的对象
 - 通过TransformerFactory创建Transformer对象
 - 使用Transformer对象的transform()方法将DOM树转换为XML文件。(该方法有两个参数,第一个参数为源数据,需要创建DOMSource对象并将Document加载到其中;第二个参数为目的文件,即要生成的XML文件,需要创建StreamResult对象并指定目的文件)
 
下面开始实现:
首先是创建DOM树的部分:
创建DocumentBuilderFactory类的对象:
// 创建DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- 1
 - 2
 

- 1
 - 2
 
创建DocumentBuilder对象:
// 创建DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
- 1
 - 2
 

- 1
 - 2
 
创建Document:
// 创建Document
Document document = builder.newDocument();
- 1
 - 2
 

- 1
 - 2
 
创建根节点:
// 创建根节点
Element bookstore = document.createElement("bookstore");
- 1
 - 2
 

- 1
 - 2
 
创建子节点并添加属性: 
 通过Document的createElement()方法可创建节点,通过Element的setAttribute()方法可设置属性。
// 创建子节点,并设置属性
Element book = document.createElement("book");
book.setAttribute("id", "1");
- 1
 - 2
 - 3
 

- 1
 - 2
 - 3
 
为book节点添加子节点: 
 通过Element的setTextContent()方法可设置节点之间的内容(节点的值),通过Element的appendChild()方法可为节点添加子节点。
// 为book添加子节点
Element name = document.createElement("name");
name.setTextContent("安徒生童话");
book.appendChild(name);
Element author = document.createElement("author");
author.setTextContent("安徒生");
book.appendChild(author);
Element price = document.createElement("price");
price.setTextContent("49");
book.appendChild(price);
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 

- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 
为根节点添加子节点:
// 为根节点添加子节点
bookstore.appendChild(book);
- 1
 - 2
 

- 1
 - 2
 
将根节点添加到Document下:
// 将根节点添加到Document下
document.appendChild(bookstore);
- 1
 - 2
 

- 1
 - 2
 
至此,DOM树就生成完了。
下面开始生成XML文件:
创建TransformerFactory对象:
// 创建TransformerFactory对象
TransformerFactory tff = TransformerFactory.newInstance();
- 1
 - 2
 

- 1
 - 2
 
创建Transformer对象:
// 创建Transformer对象
Transformer tf = tff.newTransformer();
- 1
 - 2
 

- 1
 - 2
 
使用Transformer对象的transform()方法将DOM树转换成XML:
// 使用Transformer的transform()方法将DOM树转换成XML
tf.transform(new DOMSource(document), new StreamResult(dest));
- 1
 - 2
 

- 1
 - 2
 
至此,就完成了对XML文件的生成。
运行结果如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><bookstore><book id="1"><name>安徒生童话</name><author>安徒生</author><price>49</price></book></bookstore>
- 1
 

- 1
 
可见XML文件生成成功了。但是,文件中的内容是一整行的,没有换行,不易读。 
 这时,我们需要使用Transformer的setOutputProperty()方法设置输出属性,设置为换行即可。
// 设置输出数据时换行
tf.setOutputProperty(OutputKeys.INDENT, "yes");
- 1
 - 2
 

- 1
 - 2
 
再次运行,可见XML文件中内容已正确换行:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<bookstore>
<book id="1">
<name>安徒生童话</name>
<author>安徒生</author>
<price>49</price>
</book>
</bookstore>
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 

- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 
此外,可以看到,在XML文件的声明部分中,有standalone属性,该属性表示当前XML是否有相对应的dtd或schema文件作为其说明文档。
若属性值为“yes”,则代表当前XML文件没有dtd和schema文件作为其说明文档。
由于我们这里没有用到dtd和schema,所以我们可以通过Document的setXmlStandalone()方法将该属性隐藏掉。
// 设置XML声明中standalone为yes,即没有dtd和schema作为该XML的说明文档,且不显示该属性
document.setXmlStandalone(true);
- 1
 - 2
 

- 1
 - 2
 
再次测试,可发现该已经没有该属性了。
下面给出完整的代码:
package util;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
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.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class FileUtil {
    public void createXMLByDOM(File dest) {
        // 创建DocumentBuilderFactory
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            // 创建DocumentBuilder
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 创建Document
            Document document = builder.newDocument();
            // 设置XML声明中standalone为yes,即没有dtd和schema作为该XML的说明文档,且不显示该属性
            // document.setXmlStandalone(true);
            // 创建根节点
            Element bookstore = document.createElement("bookstore");
            // 创建子节点,并设置属性
            Element book = document.createElement("book");
            book.setAttribute("id", "1");
            // 为book添加子节点
            Element name = document.createElement("name");
            name.setTextContent("安徒生童话");
            book.appendChild(name);
            Element author = document.createElement("author");
            author.setTextContent("安徒生");
            book.appendChild(author);
            Element price = document.createElement("price");
            price.setTextContent("49");
            book.appendChild(price);
            // 为根节点添加子节点
            bookstore.appendChild(book);
            // 将根节点添加到Document下
            document.appendChild(bookstore);
            /*
             * 下面开始实现: 生成XML文件
             */
            // 创建TransformerFactory对象
            TransformerFactory tff = TransformerFactory.newInstance();
            // 创建Transformer对象
            Transformer tf = tff.newTransformer();
            // 设置输出数据时换行
            tf.setOutputProperty(OutputKeys.INDENT, "yes");
            // 使用Transformer的transform()方法将DOM树转换成XML
            tf.transform(new DOMSource(document), new StreamResult(dest));
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TransformerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 - 31
 - 32
 - 33
 - 34
 - 35
 - 36
 - 37
 - 38
 - 39
 - 40
 - 41
 - 42
 - 43
 - 44
 - 45
 - 46
 - 47
 - 48
 - 49
 - 50
 - 51
 - 52
 - 53
 - 54
 - 55
 - 56
 - 57
 - 58
 - 59
 - 60
 - 61
 - 62
 - 63
 - 64
 - 65
 - 66
 - 67
 - 68
 - 69
 - 70
 - 71
 - 72
 - 73
 - 74
 - 75
 - 76
 - 77
 - 78
 - 79
 - 80
 - 81
 - 82
 - 83
 - 84
 - 85
 - 86
 - 87
 - 88
 

- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 - 31
 - 32
 - 33
 - 34
 - 35
 - 36
 - 37
 - 38
 - 39
 - 40
 - 41
 - 42
 - 43
 - 44
 - 45
 - 46
 - 47
 - 48
 - 49
 - 50
 - 51
 - 52
 - 53
 - 54
 - 55
 - 56
 - 57
 - 58
 - 59
 - 60
 - 61
 - 62
 - 63
 - 64
 - 65
 - 66
 - 67
 - 68
 - 69
 - 70
 - 71
 - 72
 - 73
 - 74
 - 75
 - 76
 - 77
 - 78
 - 79
 - 80
 - 81
 - 82
 - 83
 - 84
 - 85
 - 86
 - 87
 - 88
 
Java——DOM方式生成XML (转)的更多相关文章
- Java&Xml教程(四)使用DOM方式生成XML文件
		
在前面的教程中,我们学习了使用DOM解析方式读取和修改XML文件内容,今天我们来学习如何使用DOM解析机制生成XML文件. 下面是我们对要生成的XML文件的具体要求: 1.根节点元素为"Em ...
 - Java DOM方式解析XML(模板)
		
//创建一个DocumentBuilderFactory工厂实例 DocumentBuilderFactory DBF=DocumentBuilderFactory.newInstance(); // ...
 - 用JAXP的dom方式解析XML文件
		
用JAXP的dom方式解析XML文件,实现增删改查操作 dom方式解析XML原理 XML文件 <?xml version="1.0" encoding="UTF-8 ...
 - 用DOM方式解析XML
		
一.用DOM方式解析XML 此例子节点结构如下: 1.获取book节点属性 (1).如果不知道节点的属性,通过 NamedNodeMap attrs = book.getAttributes(); 来 ...
 - 【转载并整理】JAVA解析或生成xml的四种方法
		
参考文章 1:http://blog.csdn.net/clemontine/article/details/53011362 2:http://www.jb51.net/article/98456. ...
 - Python中使用dom模块生成XML文件示例
		
在Python中解析XML文件也有Dom和Sax两种方式,这里先介绍如何是使用Dom解析XML,这一篇文章是Dom生成XML文件,下一篇文章再继续介绍Dom解析XML文件. 在生成XML文件中,我们主 ...
 - Dom方式解析XML
		
public class TestXML { public static void main(String[] args) throws SAXException, IOException { //D ...
 - 在iOS 开发中用GDataXML(DOM方式)解析xml文件
		
因为GDataXML的内部实现是通过DOM方式解析的,而在iOS 开发中用DOM方式解析xml文件,这个时候我们需要开启DOM,因为ios 开发中是不会自动开启的,只有在mac 开发中才自动开启的.我 ...
 - Java&Xml教程(三)使用DOM方式修改XML文件内容
		
DOM解析方式也可用于修改XML数据,我们可以使用它完成新增元素.删除元素.修改元素值.修改元素属性等操作. 我们的XML文件,内容如下: employee.xml <?xml version= ...
 
随机推荐
- 单源最短路模板 + hdu - 2544
			
Floyd Floyd 本质上类似一种动态规划,dp [ i ] [ j ] = dp [ i ] [ k ] + dp[ k ] [ j ]. /** * Night gathers, and no ...
 - 利用dynamic简化数据库的访问
			
今天写了一个数据库的帮助类,代码如下. public static class DbEx { public static dynamic ReadToObject(this IDataReader r ...
 - ARM JTAG 信号 RTCK 应该如何处理?
			
用户在调试内嵌可综合内核的 CPU 如 ARM7TDMI-S 时,需要通过打开仿真器的自适应时钟功能. 此时,ARM仿真器根据 RTCK 时钟信号的频率,产生可用于 CPU 内核当前时钟主频的最快的 ...
 - STM32的CRC32 软件实现代码
			
对于STM32的32位CRC,如果假定它的一个主要目的是为了校验往内部FLASH存储数据的可靠性,那么(余数)初值是全1当然是比较合理的.由于STM32的32位CRC是纯32位,即每次必须输入32位的 ...
 - DOM对象之document对象
			
DOM对象:当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). HTML DOM 模型被构造为对象的树. 打开网页后,首先看到的是浏览器窗口,即顶层的win ...
 - Mybatis配置返回为修改影响条数
			
mybatis配置返回为修改影响条数,修改jdbc连接如下即可:添加useAffectedRows=true配置. jdbc:mysql://jdbc.host/{jdbc.db}?useAffect ...
 - 玩android 遇到的问题-2014年1月15日
			
1.变态的java工程,不是你点击run,它就run的. eclipse 默认设置,你选择哪个文件,点击run的时候,就运行哪个文件.够变态不.那么,怎么设置点击run的时候,就运行整个工程呢? 你 ...
 - ios测试宏指令出错:“Expected identefier”
			
写了一个简单的测试宏指令,然后在下面代码中报错,不知道怎么修复?谢谢 #define test(condition) do{\ if (condition) {\ //// <-----Expe ...
 - Android_开源框架_AndroidUniversalImageLoader网络图片加载
			
1.功能概要 Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示. (1).使用多线程加载图片(2) ...
 - maven的groupid和artifactId
			
groupid和artifactId被统称为“坐标”是为了保证项目唯一性而提出的,如果你要把你项目弄到maven本地仓库去,你想要找到你的项目就必须根据这两个id去查找. groupId一般分为多个段 ...