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 (转)的更多相关文章

  1. Java&Xml教程(四)使用DOM方式生成XML文件

    在前面的教程中,我们学习了使用DOM解析方式读取和修改XML文件内容,今天我们来学习如何使用DOM解析机制生成XML文件. 下面是我们对要生成的XML文件的具体要求: 1.根节点元素为"Em ...

  2. Java DOM方式解析XML(模板)

    //创建一个DocumentBuilderFactory工厂实例 DocumentBuilderFactory DBF=DocumentBuilderFactory.newInstance(); // ...

  3. 用JAXP的dom方式解析XML文件

    用JAXP的dom方式解析XML文件,实现增删改查操作 dom方式解析XML原理 XML文件 <?xml version="1.0" encoding="UTF-8 ...

  4. 用DOM方式解析XML

    一.用DOM方式解析XML 此例子节点结构如下: 1.获取book节点属性 (1).如果不知道节点的属性,通过 NamedNodeMap attrs = book.getAttributes(); 来 ...

  5. 【转载并整理】JAVA解析或生成xml的四种方法

    参考文章 1:http://blog.csdn.net/clemontine/article/details/53011362 2:http://www.jb51.net/article/98456. ...

  6. Python中使用dom模块生成XML文件示例

    在Python中解析XML文件也有Dom和Sax两种方式,这里先介绍如何是使用Dom解析XML,这一篇文章是Dom生成XML文件,下一篇文章再继续介绍Dom解析XML文件. 在生成XML文件中,我们主 ...

  7. Dom方式解析XML

    public class TestXML { public static void main(String[] args) throws SAXException, IOException { //D ...

  8. 在iOS 开发中用GDataXML(DOM方式)解析xml文件

    因为GDataXML的内部实现是通过DOM方式解析的,而在iOS 开发中用DOM方式解析xml文件,这个时候我们需要开启DOM,因为ios 开发中是不会自动开启的,只有在mac 开发中才自动开启的.我 ...

  9. Java&Xml教程(三)使用DOM方式修改XML文件内容

    DOM解析方式也可用于修改XML数据,我们可以使用它完成新增元素.删除元素.修改元素值.修改元素属性等操作. 我们的XML文件,内容如下: employee.xml <?xml version= ...

随机推荐

  1. spring cloud 学习(4) - hystrix 服务熔断处理

    hystrix 是一个专用于服务熔断处理的开源项目,当依赖的服务方出现故障不可用时,hystrix有一个所谓的断路器,一但打开,就会直接拦截掉对故障服务的调用,从而防止故障进一步扩大(类似中电路中的跳 ...

  2. Answer Sheet - Both, Either & Neither

    http://www.usingenglish.com/quizzes/answers.php?quiz_id=44 This page displays the answers to the 'Bo ...

  3. Google 镜像站搜集

    在特殊的地方和特殊的时间,流畅顺利的打开一个网站也变得如此艰难. 2016.01.16 更新.本站订阅更新功能已上线,欢迎订阅! 以下是直接使用谷歌的方法,如需***戳这里(VPN | Shadows ...

  4. C#轻量级高性能日志组件EasyLogger

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第六部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...

  5. 微软为何选择在 Github 上开源 .NET 核心?

    本文来自微软开源.NET 的一篇公告 ,文中阐述了微软为何选择在 Github 开源.NET,以及微软对开源和开源社区方面的认识的变迁. 对于.NET来说,今天(2014/11/12)是个大日子! 我 ...

  6. javascript:currentStyle和getComputedStyle的兼容写法

    currentStyle:获取计算后的样式,也叫当前样式.最终样式. 优点:可以获取元素的最终样式,包括浏览器的默认值,而不像style只能获取行间样式,所以更常用到. 注意:不能获取复合样式如bac ...

  7. Java泛型中的标记符含义:

    Java泛型中的标记符含义: E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number( ...

  8. 电脑不能使用ArcMap 提示由于系统时间不对造成的怎么办?转

    来自:http://www.jb51.net/diannaojichu/334554.html 电脑不能使用ArcMap,在打开ARCMAP时,出现"The system clock has ...

  9. 【linux】linux 下 shell命令 执行结果赋值给变量【两种方式】

    方法1:[通用方法] 使用Tab键上面的反引号 例子如下: find命令 模糊查询在/apps/swapping目录下 查找 文件名中包含swapping并且以.jar结尾的文件 使用反引号 引住命令 ...

  10. Android ormlite like() function is not working

    //http://stackoverflow.com/questions/7642161/android-ormlite-like-function-is-not-working try { Quer ...