Java---XML的解析(1)-DOM解析

网友投稿 679 2022-05-29

本章只讲DOM解析。接下来还会学习Dom4j和StAX 解析技术

DOM解析:

DOM解析一次将所有的元素全部加载到内存中:如有以下XML文档:

Jack 30

1

2

3

4

由于DOM解析,一次性的将所有元素(包含属性和文本) 全部加载到内存中,所以不适用于解析大量的数据。

JAXP-DOM解析:

包:

javax.xml.parse – 关键类DocumentBuilder,文档解析对像。

org.w3c.dom – 关键类Document代表内存中的文档对像模型。

java.xml – 关键类Transformer,用于将内存中的文档保存到文件中。

users.xml:-在xml4文件夹下面

Tom 23 李四 33

1

2

3

4

5

6

7

8

9

10

11

12

代码演示:

package cn.hncu.dom; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /** * @author 陈浩翔 2016-6-29 */ public class DomDemo1 { @Test // 需求:把第一个user节点的name的值取出来 public void getDom() throws SAXException, IOException, ParserConfigurationException { // 第一步,通过DocumentBuilderFactory类中的工厂方法等到一个dbf对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 第二步,通过dbf对象创建出一个DocumentBuilder对象 DocumentBuilder db = dbf.newDocumentBuilder(); // 第三步,通过db对象创建出一个Document对象 Document dom = db.parse("xml4/users.xml"); // db.parse( new File("xml4/users.xml") );//也可以 System.out.println(dom);// [#document: null] Node root = dom.getFirstChild();// 这个是根节点 System.out.println("root:" + root);// root:[users: null] System.out.println(root.getNodeName());// users System.out.println(root.getFirstChild().getNodeName());// #text // 上面一句的输出是:#text ----dom中把空白符也看成是一个Node,这种情况对我们的解析通常会造成很大的麻烦 // ※※为解决上面的问题,我们以后解析时尽量不要用Node,而要用Element。 // 因为Element是元素它不包含属性和文字内容(包括空白符),因此可避开空白符的干扰 Element eRoot = (Element) root; NodeList list = eRoot.getElementsByTagName("user"); System.out.println("user元素的数量:" + list.getLength()); System.out.println("第2个user元素" + list.item(1)); Node user1Node = list.item(0); Element eUser1 = (Element) user1Node;// 要把Node强转成Element,因为Element是子接口,里面有getElementBy*等方法,而Node没有(只能采用childNodes的方式,这种方式会受空白符的干扰) NodeList listNames = eUser1.getElementsByTagName("name"); String nm = listNames.item(0).getNodeName();// name--标签名 String nmVal = listNames.item(0).getTextContent();// 标签内部所包含的文本内容----相当于JavaScript中的innerText System.out.println(nm + "," + nmVal); } @Test //需求:把第二个user节点的age值取出来 public void getAge()throws Exception{ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document dom = db.parse(new File("xml4/users.xml")); Element root = (Element)dom.getFirstChild(); Element user2 = (Element)root.getElementsByTagName("user").item(1); Element eAge = (Element)user2.getElementsByTagName("age").item(0); String age = eAge.getTextContent(); System.out.println("age:"+age); } //用java对xml文档进行CRUD---创建,遍历,更新,删除 //创建---需求:添加一个新的user @Test public void create() throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder db = factory.newDocumentBuilder(); Document dom = db.parse(new File("xml4/users.xml")); Element root = (Element) dom.getFirstChild(); //创建一个新的user元素 Element eUserNode = dom.createElement("user"); eUserNode.setAttribute("id", "C001");//给元素添加属性 //创建name和age子元素 Element eName = dom.createElement("name"); eName.setTextContent("李四");//设置name标签容器中包含的文字 Element eAgeNode = dom.createElement("age"); eAgeNode.setTextContent("33"); //把所创建的元素组装成一颗子树,添加到整颗dom树上 eUserNode.appendChild(eName); eUserNode.appendChild(eAgeNode); root.appendChild(eUserNode); //再把当前内存中的dom对象存储进xml文件 TransformerFactory tf = TransformerFactory.newInstance(); Transformer trans = tf.newTransformer(); trans.transform(new DOMSource(dom), new StreamResult("xml4/users.xml")); } //遍历---查找 @Test public void query() throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder db = factory.newDocumentBuilder(); Document dom = db.parse("xml4/users.xml"); Element root = (Element) dom.getFirstChild();//得到根节点 NodeList list = root.getElementsByTagName("user");//这个user是xml文档中的元素 for(int i=0;i

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

Java---XML的解析(1)-DOM解析

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

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

小知识点:

注意:子类才可以当父类用。

父类的话,如果你确定那个类一定是这个父类的某个子类了,才可以强转为子类!!!

Java XML

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Qt-qmake install相关
下一篇:【手摸手学ModelArts】Copy攻城狮信手”粘“来 AI 对对联
相关文章