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类的对象:

// 创建DocumentBuilderFactory

DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();

1

2

save_snippets_01.png

1

2

创建DocumentBuilder对象:

// 创建DocumentBuilder

DocumentBuilder builder =factory.newDocumentBuilder();

1

2

save_snippets_01.png

1

2

创建Document:

// 创建Document

Document document =builder.newDocument();

1

2

save_snippets_01.png

1

2

创建根节点:

// 创建根节点

Element bookstore = document.createElement("bookstore");

1

2

save_snippets_01.png

1

2

创建子节点并添加属性:

通过Document的createElement()方法可创建节点,通过Element的setAttribute()方法可设置属性。

// 创建子节点,并设置属性

Element book = document.createElement("book");

book.setAttribute("id", "1");

1

2

3

save_snippets.png

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

save_snippets.png

1

2

3

4

5

6

7

8

9

10

为根节点添加子节点:

// 为根节点添加子节点

bookstore.appendChild(book);

1

2

save_snippets.png

1

2

将根节点添加到Document下:

// 将根节点添加到Document下

document.appendChild(bookstore);

1

2

save_snippets.png

1

2

至此,DOM树就生成完了。

下面开始生成XML文件:

创建TransformerFactory对象:

// 创建TransformerFactory对象

TransformerFactory tff =TransformerFactory.newInstance();

1

2

save_snippets.png

1

2

创建Transformer对象:

// 创建Transformer对象

Transformer tf =tff.newTransformer();

1

2

save_snippets.png

1

2

使用Transformer对象的transform()方法将DOM树转换成XML:

// 使用Transformer的transform()方法将DOM树转换成XML

tf.transform(new DOMSource(document), new StreamResult(dest));

1

2

save_snippets_01.png

1

2

至此,就完成了对XML文件的生成。

运行结果如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>安徒生童话安徒生49

1

save_snippets.png

1

可见XML文件生成成功了。但是,文件中的内容是一整行的,没有换行,不易读。

这时,我们需要使用Transformer的setOutputProperty()方法设置输出属性,设置为换行即可。

// 设置输出数据时换行

tf.setOutputProperty(OutputKeys.INDENT, "yes");

1

2

save_snippets.png

1

2

再次运行,可见XML文件中内容已正确换行:

安徒生童话

安徒生

49

1

2

3

4

5

6

7

8

save_snippets.png

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

save_snippets.png

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

save_snippets.png

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值