Java——DOM方式生成XML

来源:互联网 发布:linux退出命令行界面 编辑:程序博客网 时间:2024/05/29 17:47

学完了解析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类的对象:

// 创建DocumentBuilderFactoryDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

创建DocumentBuilder对象:

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

创建Document:

// 创建DocumentDocument 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树转换成XMLtf.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();        }    }}
1 0
原创粉丝点击