java w3c dom_精讲 org.w3c.dom(java dom)解析XML文档

位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会不理想

首先来了解点Java DOM 的 API:

1.解析器工厂类:DocumentBuilderFactory

创建的方法:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

2.解析器:DocumentBuilder

创建方法:通过解析器工厂类来获得 DocumentBuilder db = dbf.newDocumentBuilder();

3.文档树模型Document

创建方法:a.通过xml文档 Document doc = db.parse("bean.xml");  b.将需要解析的xml文档转化为输入流 InputStream is = new FileInputStream("bean.xml");

Document doc = db.parse(is);

Document对象代表了一个XML文档的模型树,所有的其他Node都以一定的顺序包含在Document对象之内,排列成一个树状结构,以后对XML文档的所有操作都与解析器无关,

直接在这个Document对象上进行操作即可;

包含的方法:

642bc78e57e0d1066a610c8b9f343732.png

496cca0f18dd885f76f26dee65b7f672.png

bccfd63ca9184b076d9da1cf3e5fe6cc.png

4.节点列表类NodeList

NodeList代表了一个包含一个或者多个Node的列表,根据操作可以将其简化的看做为数组

afb75a3b661318fb1aff65789f7441e4.png

5.节点类Node

Node对象是DOM中最基本的对象,代表了文档树中的抽象节点。但在实际使用中很少会直接使用Node对象,而是使用Node对象的子对象Element,Attr,Text等

6.元素类Element

是Node类最主要的子对象,在元素中可以包含属性,因而Element中有存取其属性的方法

293d6f2f0f437b9c84223b47ca682d0f.png

3e3cc22f4d60805bc52ce9eb6d7ad20b.png

7.属性类Attr

代表某个元素的属性,虽然Attr继承自Node接口,但因为Attr是包含在Element中的,但并不能将其看做是Element的子对象,因为Attr并不是DOM树的一部分

基本的知识就到此结束,更加具体的大家可以参阅JDK API文档

实战:

1.使用DOM来遍历XML文档中的全部内容并且插入元素:

school.xml文档:

1 <?xml version = "1.0" encoding = "utf-8"?>

2

3

4 沈浪

5 1006010022

6 信管2

7

浙江杭州3

8 123456

9

10

11 沈1

12 1006010033

13 信管1

14

浙江杭州4

15 234567

16

17

18 沈2

19 1006010044

20 生工2

21

浙江杭州1

22 345678

23

24

25 沈3

26 1006010055

27 电子2

28

浙江杭州2

29 456789

30

31

DomDemo.java

1 packagexidian.sl.dom;2

3 importjava.io.FileOutputStream;4

5 importjavax.xml.parsers.DocumentBuilder;6 importjavax.xml.parsers.DocumentBuilderFactory;7

8 importorg.apache.crimson.tree.XmlDocument;9 importorg.w3c.dom.Document;10 importorg.w3c.dom.Element;11 importorg.w3c.dom.NodeList;12

13

14 public classDomDemo {15 /**

16 * 遍历xml文档17 **/

18 public static voidqueryXml(){19 try{20 //得到DOM解析器的工厂实例

21 DocumentBuilderFactory dbFactory =DocumentBuilderFactory.newInstance();22 //从DOM工厂中获得DOM解析器

23 DocumentBuilder dbBuilder =dbFactory.newDocumentBuilder();24 //把要解析的xml文档读入DOM解析器

25 Document doc = dbBuilder.parse("src/xidian/sl/dom/school.xml");26 System.out.println("处理该文档的DomImplementation对象 = "+doc.getImplementation());27 //得到文档名称为Student的元素的节点列表

28 NodeList nList = doc.getElementsByTagName("Student");29 //遍历该集合,显示结合中的元素及其子元素的名字

30 for(int i = 0; i< nList.getLength() ; i ++){31 Element node =(Element)nList.item(i);32 System.out.println("Name: "+ node.getElementsByTagName("Name").item(0).getFirstChild().getNodeValue());33 System.out.println("Num: "+ node.getElementsByTagName("Num").item(0).getFirstChild().getNodeValue());34 System.out.println("Classes: "+ node.getElementsByTagName("Classes").item(0).getFirstChild().getNodeValue());35 System.out.println("Address: "+ node.getElementsByTagName("Address").item(0).getFirstChild().getNodeValue());36 System.out.println("Tel: "+ node.getElementsByTagName("Tel").item(0).getFirstChild().getNodeValue());37 }38

39 }catch(Exception e) {40 //TODO: handle exception

41 e.printStackTrace();42 }43 }44 /**

45 * 向已存在的xml文件中插入元素46 **/

47 public static voidinsertXml(){48 Element school = null;49 Element student = null;50 Element name = null;51 Element num = null;52 Element classes = null;53 Element address = null;54 Element tel = null;55 try{56 //得到DOM解析器的工厂实例

57 DocumentBuilderFactory dbFactory =DocumentBuilderFactory.newInstance();58 //从DOM工厂中获得DOM解析器

59 DocumentBuilder dbBuilder =dbFactory.newDocumentBuilder();60 //把要解析的xml文档读入DOM解析器

61 Document doc = dbBuilder.parse("src/xidian/sl/dom/school.xml");62 //得到文档名称为Student的元素的节点列表

63 NodeList nList = doc.getElementsByTagName("School");64 school = (Element)nList.item(0);65 //创建名称为Student的元素

66 student = doc.createElement("Student");67 //设置元素Student的属性值为231

68 student.setAttribute("examId", "23");69 //创建名称为Name的元素

70 name = doc.createElement("Name");71 //创建名称为 香香 的文本节点并作为子节点添加到name元素中

72 name.appendChild(doc.createTextNode("香香"));73 //将name子元素添加到student中

74 student.appendChild(name);75 /**

76 * 下面的元素依次加入即可77 **/

78 num = doc.createElement("Num");79 num.appendChild(doc.createTextNode("1006010066"));80 student.appendChild(num);81

82 classes = doc.createElement("Classes");83 classes.appendChild(doc.createTextNode("眼视光5"));84 student.appendChild(classes);85

86 address = doc.createElement("Address");87 address.appendChild(doc.createTextNode("浙江温州"));88 student.appendChild(address);89

90 tel = doc.createElement("Tel");91 tel.appendChild(doc.createTextNode("123890"));92 student.appendChild(tel);93

94 //将student作为子元素添加到树的根节点school

95 school.appendChild(student);96 //将内存中的文档通过文件流生成insertSchool.xml,XmlDocument位于crison.jar下

97 ((XmlDocument)doc).write(new FileOutputStream("src/xidian/sl/dom/insertSchool.xml"));98 System.out.println("成功");99 }catch(Exception e) {100 //TODO: handle exception

101 e.printStackTrace();102 }103 }104 public static voidmain(String[] args){105 //读取

106 DomDemo.queryXml();107 //插入

108 DomDemo.insertXml();109 }110 }

运行后结果:

75aacd23bbe45164f17e4677667a9a28.png

然后到目录下查看生成的xml文件:

ccf8f27a4b20d2000b0cfaa0dcce6e49.png

打开查看内容:

984444b4a8c4c6b41eee36edcb35eb64.png

上面添加元素后输出的文件与之前的文件不是同一个文件,如果需要输出到原文件中,那么只要将路径改为原文间路径即可:src/xidian/sl/dom/school.xml

2.创建XML过程与插入过程相似,就是Document需要创建

1 packagexidian.sl.dom;2

3 importjava.io.FileOutputStream;4

5 importjavax.xml.parsers.DocumentBuilder;6 importjavax.xml.parsers.DocumentBuilderFactory;7

8 importorg.apache.crimson.tree.XmlDocument;9 importorg.w3c.dom.Document;10 importorg.w3c.dom.Element;11

12

13 public classCreateNewDom {14 /**

15 * 创建xml文档16 **/

17 public static voidcreateDom(){18 Document doc;19 Element school,student;20 Element name = null;21 Element num = null;22 Element classes = null;23 Element address = null;24 Element tel = null;25 try{26 //得到DOM解析器的工厂实例

27 DocumentBuilderFactory dbFactory =DocumentBuilderFactory.newInstance();28 //从DOM工厂中获得DOM解析器

29 DocumentBuilder dbBuilder =dbFactory.newDocumentBuilder();30 //创建文档树模型对象

31 doc =dbBuilder.newDocument();32 if(doc != null){33 //创建school元素

34 school = doc.createElement("School");35 //创建student元素

36 student = doc.createElement("Student");37 //设置元素Student的属性值为231

38 student.setAttribute("examId", "23");39 //创建名称为Name的元素

40 name = doc.createElement("Name");41 //创建名称为 香香 的文本节点并作为子节点添加到name元素中

42 name.appendChild(doc.createTextNode("香香"));43 //将name子元素添加到student中

44 student.appendChild(name);45 /**

46 * 下面的元素依次加入即可47 **/

48 num = doc.createElement("Num");49 num.appendChild(doc.createTextNode("1006010066"));50 student.appendChild(num);51

52 classes = doc.createElement("Classes");53 classes.appendChild(doc.createTextNode("眼视光5"));54 student.appendChild(classes);55

56 address = doc.createElement("Address");57 address.appendChild(doc.createTextNode("浙江温州"));58 student.appendChild(address);59

60 tel = doc.createElement("Tel");61 tel.appendChild(doc.createTextNode("123890"));62 student.appendChild(tel);63

64 //将student作为子元素添加到树的根节点school

65 school.appendChild(student);66 //添加到文档树中

67 doc.appendChild(school);68 //将内存中的文档通过文件流生成insertSchool.xml,XmlDocument位于crison.jar下

69 ((XmlDocument)doc).write(new FileOutputStream("src/xidian/sl/dom/createSchool.xml"));70 System.out.println("创建成功");71 }72 }catch(Exception e) {73 //TODO: handle exception

74 e.printStackTrace();75 }76 }77 public static voidmain(String[] args) {78 CreateNewDom.createDom();79 }80 }

运行结果:

9eb239bdd82be4c66d69bf6e53393c45.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值