XML 操作

在XML应用中，最常用也最实用的莫过于XML文件的读写，通过一个简单的XML文件读写来作简要分析。可以在任何文本编辑器中先建立如下结构的XML文件，类似于HTML结构，但XML语义比较严格，起始标记必须配对，比如"〈学生花名册〉"与"〈／学生花名册〉"对应，空格多少可不必在意，但一般都以缩格形式书写，便于阅读。把此文件命名为Input.xml，可以在任何支持XML的浏览器中打开测试一下，如果输入正确，在浏览中可以看到此文件的树形表示结构。

＜?xml version="1.0" encoding="GB2312"?＞

＜学生花名册＞

＜学生　性别　=　"男"＞

＜姓名＞李xx＜/姓名＞

＜年龄＞14＜/年龄＞

＜电话＞1111＜/电话＞

＜/学生＞

＜学生　性别　=　"男"＞

＜姓名＞张三＜/姓名＞

＜年龄＞16＜/年龄＞

＜电话＞22222＜/电话＞

＜/学生＞

＜/学生花名册＞

准备工作做完后，接着就开始写实质性的JAVA代码了。为保存从XML文件读入的信息，需要先建一个简单的Bean来保存学生信息，命名为StudentBean，代码如下所示：

1. public class StudentBean {

2. private　String　sex;　//学生性别

3. private　String　name;　//学生姓名

4. private　int　age;　//学生年龄

5. private　String　phone;　//电话号码

6.

7. public void setSex(String s) {

8. sex　=　s;

9. }

10. public void setName(String s) {

11. name　=　s;

12. }

13. public　void　setAge(int　a)　{

14. age　=　a;

15. }

16. public　void　setPhone(String　s)　{

17. phone = s;

18. }

19. public String getSex() {

20. return sex;

21. }

22. public String getName() {

23. return　name;

24. }

25. public int getAge() {

26. return age;

27. }

28. public String getPhone() {

29. return phone;

30. }

31. }

之后写XML的测试类，这个类命名为XMLTest，为了读写XML文件，需要导入如下JAVA包，"//"后为注释说明。

import　java.io.*;　//Java基础包，包含各种IO操作

import　java.util.*;　//Java基础包，包含各种标准数据结构操作

import　javax.xml.parsers.*;　//XML解析器接口

import　org.w3c.dom.*;　//XML的DOM实现

import　org.apache.crimson.tree.XmlDocument;//写XML文件要用到

为了保存多个学生信息，还得借助一个集合类(并不是单纯意义上的集合，JAVA中的集合是集合框架的概念，包含向量、列表、哈希表等），这里采用Vector向量类。定义在XMLTest测试类中，命名为student_Vector。然后定义两个方法readXMLFile和writeXMLFile，实现读写操作。代码如下：

1. private　void　readXMLFile(String　inFile)　throws　Exception　{

2. //为解析XML作准备，创建DocumentBuilderFactory实例,指定DocumentBuilder

3. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

4. DocumentBuilder db = null;

5. try {

6. db = dbf.newDocumentBuilder();

7. }catch (ParserConfigurationException pce) {

8. System.err.println(pce);　//出异常时输出异常信息，然后退出，下同

9. System.exit(1);

10. }

11.

12. Document　doc　=　null;

13. try {

14. doc = db.parse(inFile);

15. } catch (DOMException dom) {

16. System.err.println(dom.getMessage());

17. System.exit(1);

18. } catch (IOException ioe) {

19. System.err.println(ioe);

20. System.exit(1);

21. }

22. //下面是解析XML的全过程，比较简单，先取根元素"学生花名册"

23. Element root = doc.getDocumentElement();

24. //取"学生"元素列表

25. NodeList students = root.getElementsByTagName("学生");

26. for (int i = 0; i＜students.getLength(); i++) {

27. //依次取每个"学生"元素

28. Element student = (Element) students.item(i);

29. //创建一个学生的Bean实例

30. StudentBean studentBean = new StudentBean();

31. //取学生的性别属性

32. studentBean.setSex(student.getAttribute("性别"));

33. //取"姓名"元素，下面类同

34. NodeList names = student.getElementsByTagName("姓名");

35. if (names.getLength() == 1) {

36. Element e = (Element) names.item(0);

37. Text t = (Text) e.getFirstChild();

38. studentBean.setName(t.getNodeValue());

39. }

40.

41. NodeList ages = student.getElementsByTagName("年龄");

42. if (ages.getLength() == 1) {

43. Element e = (Element) ages.item(0);

44. Text t = (Text) e.getFirstChild();

45. studentBean.setAge(Integer.parseInt(t.getNodeValue()));

46. }

47.

48. NodeList　phones　=　student.getElementsByTagName("电话");

49. if　(phones.getLength()　==　1)　{

50. Element　e　=　(Element)　phones.item(0);

51. Text t = (Text) e.getFirstChild();

52. studentBean.setPhone(t.getNodeValue());

53. }

54.

55. student_Vector.add(studentBean);

56. }

57. }

58.

59. private void writeXMLFile(String outFile) throws Exception {

60. //为解析XML作准备，创建DocumentBuilderFactory实例,指定DocumentBuilder

61. DocumentBuilderFactory　dbf　=　DocumentBuilderFactory.newInstance();

62. DocumentBuilder　db　=　null;

63. try　{

64. db　=　dbf.newDocumentBuilder();

65. } catch (ParserConfigurationException pce) {

66. System.err.println(pce);

67. System.exit(1);

68. }

69.

70. Document　doc　=　null;

71. doc = db.newDocument();

72.

73. //下面是建立XML文档内容的过程，先建立根元素"学生花名册"

74. Element　root　=　doc.createElement("学生花名册");

75. //根元素添加上文档

76. doc.appendChild(root);

77.

78. //取学生信息的Bean列表

79. for　(int　i　=　0;　i　＜　student_Vector.size();　i++)　{

80. //依次取每个学生的信息

81. StudentBean studentBean = (StudentBean) student_Vector.get(i);

82. //建立"学生"元素，添加到根元素

83. Element　student　=　doc.createElement("学生");

84. student.setAttribute("性别",　studentBean.getSex());

85. root.appendChild(student);

86. //建立"姓名"元素，添加到学生下面，下同

87. Element name = doc.createElement("姓名");

88. student.appendChild(name);

89. Text tName = doc.createTextNode(studentBean.getName());

90. name.appendChild(tName);

91.

92. Element　age　=　doc.createElement("年龄");

93. student.appendChild(age);

94. Text tAge = doc.createTextNode(String.valueOf(studentBean.getAge()));

95. age.appendChild(tAge);

96.

97. Element　phone　=　doc.createElement("电话");

98. student.appendChild(phone);

99. Text　tPhone　=　doc.createTextNode(studentBean.getPhone());

100. phone.appendChild(tPhone);

101. }

102. //把XML文档输出到指定的文件

103. FileOutputStream outStream = new FileOutputStream(outFile);

104. OutputStreamWriter outWriter = new OutputStreamWriter(outStream);

105. ((XmlDocument) doc).write(outWriter, "GB2312");

106. outWriter.close();

107. outStream.close();

108. }

最后加入测试主函数，如下：

public static void main(String[] args) throws Exception {

//建立测试实例

XMLTest　xmlTest　=　new　XMLTest();

//初始化向量列表

xmlTest.student_Vector　=　new　Vector();

System.out.println("开始读Input.xml文件");

xmlTest.readXMLFile("Input.xml");

System.out.println("读入完毕,开始写Output.xml文件");

xmlTest.writeXMLFile("Output.xml");

System.out.println("写入完成");

}

保存好StudentBean和XMLTest，把Input.xml保存到工作目录下。