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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • oracle的dba_oracle导出dmp

    oracle的dba_oracle导出dmp双语使用场景TheOracledatabaseadministrator(DBA)willconsidermanyfactorsrelatedtofailover,loadbalancing,andotherswhilecreatingandconfiguringanrac.───Oracle数据库管理员(DBA)在创建和配置rac时需要考虑与故障转移、负…

    2022年9月26日
    6
  • Flink教程(30)- Flink VS Spark[通俗易懂]

    Flink教程(30)- Flink VS Spark[通俗易懂]文章目录01引言02FlinkVSSpark2.1运行角色2.2生态2.3运行模型2.4编程模型对比2.5任务调度原理2.6时间机制对比2.7kafka动态分区检测2.7.1SparkStreaming2.7.2Flink2.8容错机制及处理语义2.8.1SparkStreaming保证仅一次处理2.8.2Flink与kafka0.11保证仅一次处理2.9Backpressure背压/反压2.9.1SparkStreaming的背压2.9.2Fli

    2025年6月3日
    2
  • 怎么删除iis和重装iis_iis未将对象引用设置到对象的实例

    怎么删除iis和重装iis_iis未将对象引用设置到对象的实例可以通过Firefox的Firebug插件,或者直接在Chro**重点内容me浏览器中键入**Ctrl+J来检查响应的头部信息。不需要的信息有:ServerMicrosoft-IIS/7.5X-AspNetMvc-Version3.0X-AspNet-Version4.0.303319X-Powered-ByASP.NET移除X-AspNet-Version

    2022年9月29日
    3
  • SPPnet论文总结

    SPPnet论文总结小菜看了SPPNet这篇论文之后,也是参考了前人的博客,结合自己的一些观点写了这篇论文总结。这里参考的连接如下:[http://blog.csdn.net/u013078356/article/details/50865183]论文:《SpatialPyramidPoolinginDeepConvolutionalNetwo

    2022年6月7日
    31
  • SAE J1939介绍

    SAE J1939介绍CAN协议最初由美国博世公司提出,后来SAE在CAN2.0B的基础之上提出J1939协议,该协议主要面向客车和载重货车。J1939协议对应ISO提出的七层OSI模型中的物理层、数据链路层、网络层和应用层,除了这四层,为了保证数据的准确传输和故障诊断,J1939还具有网络管理和应用层诊断。物理层对应J1939-11、J1939-15;数据链路层对应协议中的J1939-21;网络层对应协议中的

    2022年5月1日
    113
  • 黑盒测试用例设计 二[通俗易懂]

    黑盒测试用例设计 二[通俗易懂]因果图法一.方法简介1.定义是一种利用图解法分析输入的各种组合情况,从而设计测试用例的方法,它适合于检查程序输入条件的各种组合情况。2.因果图法产生的背景等价类划分法和边界值分析方法都是着重考虑输入条件,但没有考虑输入条件的各种组合、输入条件之间的相互制约关系。这样虽然各种输入条件可能出错的情况已经测试到了,但多个输入条件组合起来可能出错的情况却被忽视了。如果在测试时必须考虑输入条件…

    2022年4月30日
    43

发表回复

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

评论列表(1条)

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

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

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