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

	}

}

在这里插入图片描述

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 基于springboot的旅游管理系统

    基于springboot的旅游管理系统1,项目功能:(1)旅游路线(2)旅游景点(3)餐饮住宿(4)旅游车票(5)旅游保险(6)旅游攻略(7)注意事项(8)会员中心(9)用户管理(10)内容管理(11)业务管理(12)数据分析2,涉及技术:SpringBoot框架,Maven,Tomcat3,开发环境:IDEA,MySQL数据库4,讲解方式:从环境安装,项目搭建,以及项目介绍等进行讲解5,包含资料:项目源码(含数据库文件),环境安装包,项目文档。课程链接+项目下载:基于spr…

  • redhat7安装图形化界面命令_红旗linux官网

    redhat7安装图形化界面命令_红旗linux官网redflaglinuxdesktop5.0对硬件的基本要求是多高?(转)[@more@]从中科红旗的网站(http://www.redflag-linux.com/chanpin/ws5/ws5.html)里下载的红旗桌…

  • 修改表名列名mysql_怎么修改mysql的表名和列名?

    修改表名列名mysql_怎么修改mysql的表名和列名?在mysql中,可以通过“ALTERTABLE旧表名RENAME新表名;”语句来修改表名,通过“ALTERTABLE表名CHANGE旧字段名/列名新字段名/列名新数据类型;”语句来修改列名。修改mysql的表名MySQL通过ALTERTABLE语句来实现表名的修改,语法规则如下:ALTERTABLERENAME[TO];其中,TO为可选参数,使用与否均不影…

  • python流程控制

    流程控制概念什么是流程控制?关于声明式编程语言和函数式编程语言详解以上是官方的解释,我们列举一个现实中的实例来具体说明一下Python的条件和循环语句,决定了程序的控制流程,体现结构的多样性。

  • docker卸载命令_docker删除文件

    docker卸载命令_docker删除文件使用yum安装docker(安装过程可以参照linux安装docker),如需卸载docker可以按一下步骤操作:1、查看当前docker状态如果是运行状态则停掉systemctlstopdocker2、查看yum安装的docker文件包yumlistinstalled|grepdocker查看docker相关的rpm源文件rpm-qa|grepdocker3、删除所有安装的docker文件包yum-yremovedoc

  • 这 10 款良心 Windows 软件,改变你对国产的认知

    这 10 款良心 Windows 软件,改变你对国产的认知提起国产Windows软件,你可能首先想到的是捆绑安装、弹窗广告、卸载残留等关键词。尽管一些所谓「大厂」的确致力于拉低业界的下限,但依然有开发者坚守底线,为改变整个生态圈而默默努力。今天,少数派就

发表回复

您的电子邮箱地址不会被公开。

评论列表(1条)

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

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

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