首页 > 代码库 > Java——DOM方式生成XML (转)
Java——DOM方式生成XML (转)
http://blog.csdn.net/u012325167/article/details/50943202
使用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();
- 1
- 2
- 1
- 2
创建DocumentBuilder对象:
// 创建DocumentBuilderDocumentBuilder builder = factory.newDocumentBuilder();
- 1
- 2
- 1
- 2
创建Document:
// 创建DocumentDocument document = builder.newDocument();
- 1
- 2
- 1
- 2
创建根节点:
// 创建根节点Element bookstore = document.createElement("bookstore");
- 1
- 2
- 1
- 2
创建子节点并添加属性:
通过Document的createElement()
方法可创建节点,通过Element的setAttribute()
方法可设置属性。
// 创建子节点,并设置属性Element book = document.createElement("book");book.setAttribute("id", "1");
- 1
- 2
- 3
- 1
- 2
- 3
为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);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
为根节点添加子节点:
// 为根节点添加子节点bookstore.appendChild(book);
- 1
- 2
- 1
- 2
将根节点添加到Document下:
// 将根节点添加到Document下document.appendChild(bookstore);
- 1
- 2
- 1
- 2
至此,DOM树就生成完了。
下面开始生成XML文件:
创建TransformerFactory对象:
// 创建TransformerFactory对象TransformerFactory tff = TransformerFactory.newInstance();
- 1
- 2
- 1
- 2
创建Transformer对象:
// 创建Transformer对象Transformer tf = tff.newTransformer();
- 1
- 2
- 1
- 2
使用Transformer对象的transform()
方法将DOM树转换成XML:
// 使用Transformer的transform()方法将DOM树转换成XMLtf.transform(new DOMSource(document), new StreamResult(dest));
- 1
- 2
- 1
- 2
至此,就完成了对XML文件的生成。
运行结果如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><bookstore><book id="1"><name>安徒生童话</name><author>安徒生</author><price>49</price></book></bookstore>
- 1
- 1
可见XML文件生成成功了。但是,文件中的内容是一整行的,没有换行,不易读。
这时,我们需要使用Transformer的setOutputProperty()
方法设置输出属性,设置为换行即可。
// 设置输出数据时换行tf.setOutputProperty(OutputKeys.INDENT, "yes");
- 1
- 2
- 1
- 2
再次运行,可见XML文件中内容已正确换行:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><bookstore><book id="1"><name>安徒生童话</name><author>安徒生</author><price>49</price></book></bookstore>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
此外,可以看到,在XML文件的声明部分中,有standalone
属性,该属性表示当前XML是否有相对应的dtd或schema文件作为其说明文档。
若属性值为“yes”,则代表当前XML文件没有dtd和schema文件作为其说明文档。
由于我们这里没有用到dtd和schema,所以我们可以通过Document的setXmlStandalone()
方法将该属性隐藏掉。
// 设置XML声明中standalone为yes,即没有dtd和schema作为该XML的说明文档,且不显示该属性document.setXmlStandalone(true);
- 1
- 2
- 1
- 2
再次测试,可发现该已经没有该属性了。
下面给出完整的代码:
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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
Java——DOM方式生成XML (转)