关于Document生成xml的总结(二)

本文档主要介绍了使用DOM对象生成XML的总结内容,详细探讨了相关代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张小洛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值