您的位置:首页 > 编程语言 > Java开发

JAVA 使用 DOM 解析 XML

2014-11-05 15:26 295 查看
首先来了解点 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 对象上进行操作即可.

4.节点列表类 NodeList

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

5.节点类 Node

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

6.元素类 Element

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

7.属性类 Attr

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

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

代码:

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

school.xml 文档:

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

<Student>
<Name>沈浪</Name>
<Num>1006010022</Num>
<Classes>信管 2</Classes>
<Address>浙江杭州 3</Address>
<Tel>123456</Tel>
 </Student>

 <Student>
<Name>沈 1</Name>
<Num>1006010033</Num>
<Classes>信管 1</Classes>
<Address>浙江杭州 4</Address>
<Tel>234567</Tel>
</Student>

  <Student>
<Name>沈 2</Name>
<Num>1006010044</Num>
<Classes>生工 2</Classes>
<Address>浙江杭州 1</Address>
<Tel>345678</Tel>
</Student>

 <Student>
<Name>沈 3</Name>
<Num>1006010055</Num>
<Classes>电子 2</Classes>
<Address>浙江杭州 2</Address>
<Tel>456789</Tel>
</Student>

 </School>DomDemo.java
package xidian.sl.dom;
2.
3. import java.io.FileOutputStream;
4.
5. import javax.xml.parsers.DocumentBuilder;
6. import javax.xml.parsers.DocumentBuilderFactory;
7.
8. import org.apache.crimson.tree.XmlDocument;
9. import org.w3c.dom.Document;
10. import org.w3c.dom.Element;
11. import org.w3c.dom.NodeList;
12.
13.
14. public class DomDemo {
15.
/**
16. * 遍历 xml 文档
17. * */
18.
public static void queryXml(){
19.
try{
20. //得到 DOM 解析器的工厂实例
21. DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newIns
tance();
22. //从 DOM 工厂中获得 DOM 解析器
23. DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();
24. //把要解析的 xml 文档读入 DOM 解析器
25. Document doc = dbBuilder.parse("src/xidian/sl/dom/school.xml");
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("C
lasses").item(0).getFirstChild().getNodeValue());
35.
System.out.println("Address: "+ node.getElementsByTagName("A
ddress").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 void insertXml(){
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.newIns
tance();
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 void main(String[] args){
105. //读取
106. DomDemo.queryXml();
107. //插入
108. DomDemo.insertXml();
109.
}
110. }

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java dom