Java——DOM方式生成XML

Java——DOM方式生成XML学完了解析XML,就该学习生成XML文件了。首先学习的是如何使用DOM方式生成XML文件。使用DOM方式生成XML文件有如下几步:首先是创建DOM树(即规定XML文件中的内容):创建DocumentBuilderFactory对象通过DocumentBuilderFactory对象创建DocumentBuilder对象通过DocumentBuilder对象的newDocument()方法创建一

大家好,又见面了,我是你们的朋友全栈君。

学完了解析XML,就该学习生成XML文件了。

首先学习的是如何使用DOM方式生成XML文件。


使用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();

创建DocumentBuilder对象:

// 创建DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();

创建Document:

// 创建Document
Document document = builder.newDocument();

创建根节点:

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

创建子节点并添加属性:
通过Document的createElement()方法可创建节点,通过Element的setAttribute()方法可设置属性。

// 创建子节点,并设置属性
Element book = document.createElement("book");
book.setAttribute("id", "1");

为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);

为根节点添加子节点:

// 为根节点添加子节点
bookstore.appendChild(book);

将根节点添加到Document下:

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

至此,DOM树就生成完了。


下面开始生成XML文件:

创建TransformerFactory对象:

// 创建TransformerFactory对象
TransformerFactory tff = TransformerFactory.newInstance();

创建Transformer对象:

// 创建Transformer对象
Transformer tf = tff.newTransformer();

使用Transformer对象的transform()方法将DOM树转换成XML:

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

至此,就完成了对XML文件的生成。


运行结果如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><bookstore><book id="1"><name>安徒生童话</name><author>安徒生</author><price>49</price></book></bookstore>

可见XML文件生成成功了。但是,文件中的内容是一整行的,没有换行,不易读。
这时,我们需要使用Transformer的setOutputProperty()方法设置输出属性,设置为换行即可。

// 设置输出数据时换行
tf.setOutputProperty(OutputKeys.INDENT, "yes");

再次运行,可见XML文件中内容已正确换行:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<bookstore>
<book id="1">
<name>安徒生童话</name>
<author>安徒生</author>
<price>49</price>
</book>
</bookstore>

此外,可以看到,在XML文件的声明部分中,有standalone属性,该属性表示当前XML是否有相对应的dtd或schema文件作为其说明文档。

若属性值为“yes”,则代表当前XML文件没有dtd和schema文件作为其说明文档。

由于我们这里没有用到dtd和schema,所以我们可以通过Document的setXmlStandalone()方法将该属性隐藏掉。

// 设置XML声明中standalone为yes,即没有dtd和schema作为该XML的说明文档,且不显示该属性
document.setXmlStandalone(true);

再次测试,可发现该已经没有该属性了。


下面给出完整的代码:

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();
		}

	}

}

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162469.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • LeetCode 606. Construct String from Binary Tree「建议收藏」

    LeetCode 606. Construct String from Binary Tree

    2022年4月2日
    42
  • a标签去下划线或文字添加下修饰_a标签去掉下划线_百度经验「建议收藏」

    a标签去下划线或文字添加下修饰_a标签去掉下划线_百度经验「建议收藏」是默认有下划线的。所以有时候为了美观,我们需要去掉下划线,使网页更加美观正常状态下的a标签是这样的。去掉下划线只需要在样式里面加入a{text-decoration:none;}或者这里是A标签还有更加详细的设置。a:link{text-decoration:none;/*指正常的未被访问过的链接*/}a:visited{text-decoration:none;/*指已经访问过的链接*…

    2022年6月1日
    38
  • vue实现简单的分页功能[通俗易懂]

    vue实现简单的分页功能[通俗易懂]分页其实就是对一组数据分组!而vue又刚好是数据驱动,所以我们只需要关注数据层就行了!分页开始—>变量:data(){return{//假设这是后台传来的数据来源data:[],//所有页面的数据totalPage:[],//每页显示数量pageSize:5,…

    2022年10月1日
    0
  • 【概率论】5-9:多项式分布(The Multinomial Distributions)

    【概率论】5-9:多项式分布(The Multinomial Distributions)title:【概率论】5-9:多项式分布(TheMultinomialDistributions)categories:-Mathematic-Probabilitykeywords:-TheMultinomialDistributionstoc:truedate:2018-04-0422:17:23Abstract:本文介绍多项式分布的相关知识Keyw…

    2022年10月12日
    0
  • 负载均衡、Apache 负载均衡配置[通俗易懂]

    负载均衡、Apache 负载均衡配置[通俗易懂][1]Apache负载均衡设置方法mod_proxy使用介绍一般来说,负载均衡就是将客户端的请求分流给后端的各个真实服务器,达到负载均衡的目的。还有一种方式是用两台服务器,一台作为主服务器(Master),另一台作为热备份(HotStandby),请求全部分给主服务器,在主服务器当机时,立即切换到备份服务器,以提高系统的整体可 第一次看到这个标题时我也很惊讶,Apache居然还能做负载

    2022年9月9日
    0
  • 罗马字符的读音「建议收藏」

    罗马字符的读音「建议收藏」Αα阿尔法alfaΒβ贝塔bitaΓγ伽马gamaΔδ德耳塔dêltaΕε艾普西龙êpsilonΖζ度截塔zitaΗη艾塔yitaΘθ西塔sitaΙι约塔yotaΚκ卡帕kapa∧λ兰布达lamdaΜμ米尤miuΝν纽niuΞξ克西ksaiΟο奥密克戎oumikelong∏π派paiΡρ版若rou…

    2022年9月30日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论列表(1条)

  • 匿名的头像
    匿名 2022年10月8日 下午12:51

    原文地址:https://blog.csdn.net/u012325167/article/details/50943202

关注全栈程序员社区公众号