用Java语言遍历读取和操纵XML文档-xml文件

实验环境:jdk1.9

实验工具:eclipse

问题:

Students.xml

[html] view plain copy

  1. <?xml version="1.0" encoding="GB2312"?>
  2. <学生名单>
  3. <学生>
  4. <学号>201501110101</学号>
  5. <姓名 爱好="足球">张三</姓名>
  6. <性别></性别>
  7. <专业>软件工程</专业>
  8. <数学>85</数学>
  9. <英语>90</英语>
  10. </学生>
  11. <学生>
  12. <学号>201501110102</学号>
  13. <姓名 爱好="篮球">李四</姓名>
  14. <性别></性别>
  15. <专业>软件工程</专业>
  16. <数学>92</数学>
  17. <英语>75</英语>
  18. </学生>
  19. <学生>
  20. <学号>201501110103</学号>
  21. <姓名>王五</姓名>
  22. <性别></性别>
  23. <专业>软件工程</专业>
  24. <数学>79</数学>
  25. <英语>88</英语>
  26. </学生>
  27. <学生>
  28. <学号>201501110104</学号>
  29. <姓名 爱好="音乐">赵六</姓名>
  30. <性别></性别>
  31. <专业>软件工程</专业>
  32. <数学>79</数学>
  33. <英语>88</英语>
  34. </学生>
  35. <学生>
  36. <学号>201501110105</学号>
  37. <姓名>刘七</姓名>
  38. <性别></性别>
  39. <专业>软件工程</专业>
  40. <数学>90</数学>
  41. <英语>74</英语>
  42. </学生>
  43. <学生>
  44. <学号>201501110106</学号>
  45. <姓名 爱好="上网">张君宝</姓名>
  46. <性别></性别>
  47. <专业>软件工程</专业>
  48. <数学>91</数学>
  49. <英语>67</英语>
  50. </学生>
  51. <学生>
  52. <学号>201501110107</学号>
  53. <姓名>崔春晓</姓名>
  54. <性别></性别>
  55. <专业>软件工程</专业>
  56. <数学>70</数学>
  57. <英语>83</英语>
  58. </学生>
  59. <学生>
  60. <学号>201501110108</学号>
  61. <姓名>倪冰</姓名>
  62. <性别></性别>
  63. <专业>软件工程</专业>
  64. <数学>91</数学>
  65. <英语>76</英语>
  66. </学生>
  67. <学生>
  68. <学号>201501110109</学号>
  69. <姓名>杨惠</姓名>
  70. <性别></性别>
  71. <专业>软件工程</专业>
  72. <数学>78</数学>
  73. <英语>90</英语>
  74. </学生>
  75. <学生>
  76. <学号>201501110110</学号>
  77. <姓名 爱好="音乐">李中华</姓名>
  78. <性别></性别>
  79. <专业>软件工程</专业>
  80. <数学>98</数学>
  81. <英语>79</英语>
  82. </学生>
  83. <学生>
  84. <学号>201501110201</学号>
  85. <姓名>张越</姓名>
  86. <性别></性别>
  87. <专业>网络工程</专业>
  88. <数学>85</数学>
  89. <英语>97</英语>
  90. </学生>
  91. <学生>
  92. <学号>201501110202</学号>
  93. <姓名>秦水天</姓名>
  94. <性别></性别>
  95. <专业>网络工程</专业>
  96. <数学>52</数学>
  97. <英语>76</英语>
  98. </学生>
  99. <学生>
  100. <学号>201501110203</学号>
  101. <姓名>张名扬</姓名>
  102. <性别></性别>
  103. <专业>网络工程</专业>
  104. <数学>50</数学>
  105. <英语>69</英语>
  106. </学生>
  107. <学生>
  108. <学号>201501110204</学号>
  109. <姓名>张楚越</姓名>
  110. <性别></性别>
  111. <专业>网络工程</专业>
  112. <数学>82</数学>
  113. <英语>77</英语>
  114. </学生>
  115. <学生>
  116. <学号>201501110205</学号>
  117. <姓名 爱好="上网">林子默</姓名>
  118. <性别></性别>
  119. <专业>网络工程</专业>
  120. <数学>95</数学>
  121. <英语>86</英语>
  122. </学生>
  123. <学生>
  124. <学号>201501110206</学号>
  125. <姓名 爱好="看电视">李子涵</姓名>
  126. <性别></性别>
  127. <专业>网络工程</专业>
  128. <数学>77</数学>
  129. <英语>88</英语>
  130. </学生>
  131. </学生名单>

问题:

对于前面实验中所用的XML文档“Students.xml”,利用Java语言JAXP编程实现下面功能:

9-1.全部显示:显示XML文档“Students.xml”中的所有学生信息;

9-2.显示姓名:仅显示XML文档“Students.xml”中的所有学生的姓名;

9-3.显示属性:仅显示XML文档“Students.xml”中有爱好的学生的姓名及爱好;

9-4.查询学生:依据学号查找XML文档“Students.xml”中的学生信息并显示,若找不到给予提示。

9-5.添加学生:依据给定的学生信息添加新的学生,成功添加后给予提示。要注意新添加学生的学号不能与已有学生的学号相同,出现此种情况时给予提示。

9-6.删除学生:依据给定的学生学号删除指定学生,成功删除后给予提示。若找不到所给学号的学生,给予提示“该学生不存在,无法删除”。

9-7.更新学生:为“Students.xml”文档中每位学生信息的最后面增加“平均”元素信息,其内容是该学生的“数学”与“英语”成绩的平均分。

注:

用eclipse新建java程序。把Students.xml文件放到本地的workSpace中,只有这样,才能在当前路径下解析xml文件。

Experiment9_1ShowAll.java

[html] view plain copy

  1. package com.xml.psd;
  2. import java.io.File;
  3. import javax.xml.parsers.DocumentBuilder;
  4. import javax.xml.parsers.DocumentBuilderFactory;
  5. import org.w3c.dom.Document;
  6. import org.w3c.dom.Element;
  7. public class Experiment9_1ShowAll {
  8. public static void main(String[] args) {
  9. try{
  10. DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance();
  11. dbf.setNamespaceAware(true);
  12. DocumentBuilder db= dbf.newDocumentBuilder();
  13. Document doc= db.parse("Students.xml");
  14. Element root=doc.getDocumentElement();
  15. String rootName=root.getNodeName();
  16. System.out.println("-----潘圣东-----");
  17. System.out.println(" 根元素名称是:"+rootName);
  18. String content=root.getTextContent();
  19. System.out.println(content);
  20. }catch(Exception e){
  21. System.out.println(e);
  22. }
  23. }
  24. }

Experiment9_2ShowAllName.java

[html] view plain copy

  1. package com.xml.psd;
  2. import java.io.File;
  3. import javax.xml.parsers.DocumentBuilder;
  4. import javax.xml.parsers.DocumentBuilderFactory;
  5. import org.w3c.dom.Document;
  6. import org.w3c.dom.Element;
  7. import org.w3c.dom.Node;
  8. import org.w3c.dom.NodeList;
  9. public class Experiment9_2ShowAllName {
  10. public static void main(String[] args) {
  11. try{
  12. DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance();
  13. dbf.setNamespaceAware(true);
  14. DocumentBuilder db= dbf.newDocumentBuilder();
  15. Document doc= db.parse("Students.xml");
  16. Element root=doc.getDocumentElement();
  17. String rootName=root.getNodeName();
  18. System.out.println("-----潘圣东-----");
  19. System.out.println(" 根元素名称是:"+rootName);
  20. NodeList namesList=doc.getElementsByTagName("姓名");
  21. int length=namesList.getLength();
  22. //System.out.println(length);
  23. for(int i=0;i<length;i++){
  24. Node node=namesList.item(i);
  25. String content=node.getTextContent();
  26. System.out.print(node.getNodeName());
  27. System.out.println(":"+content);
  28. }
  29. }catch(Exception e){
  30. System.out.println(e);
  31. }
  32. }
  33. }

Experiment9_3ShowNameAndHobby.java

[html] view plain copy

  1. package com.xml.psd;
  2. import javax.xml.parsers.DocumentBuilder;
  3. import javax.xml.parsers.DocumentBuilderFactory;
  4. import org.w3c.dom.Document;
  5. import org.w3c.dom.Element;
  6. import org.w3c.dom.Node;
  7. import org.w3c.dom.NodeList;
  8. public class Experiment9_3ShowNameAndHobby {
  9. public static void main(String[] args) {
  10. try{
  11. DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance();
  12. dbf.setNamespaceAware(true);
  13. DocumentBuilder db= dbf.newDocumentBuilder();
  14. Document doc= db.parse("Students.xml");
  15. Element root=doc.getDocumentElement();
  16. String rootName=root.getNodeName();
  17. System.out.println("-----潘圣东-----");
  18. System.out.println(" 根元素名称是:"+rootName);
  19. NodeList namesList=doc.getElementsByTagName("姓名");
  20. int length=namesList.getLength();
  21. for(int i=0;i<length;i++){
  22. Node node=namesList.item(i);
  23. Element elementNode=(Element)node; // 将节点转换为元素节点
  24. String name=node.getTextContent();// 获得节点的文本内容
  25. String content=elementNode.getAttribute("爱好");// 获得元素节点的属性
  26. if(content!=""){
  27. System.out.print(name);
  28. System.out.println(":"+content);
  29. }
  30. }
  31. }catch(Exception e){
  32. System.out.println(e);
  33. }
  34. }
  35. }

Experiment9_4QueryByID.java

[html] view plain copy

  1. package com.xml.psd;
  2. import java.util.ArrayList;
  3. import java.util.Scanner;
  4. import javax.xml.parsers.DocumentBuilder;
  5. import javax.xml.parsers.DocumentBuilderFactory;
  6. import org.w3c.dom.Document;
  7. import org.w3c.dom.Element;
  8. import org.w3c.dom.Node;
  9. import org.w3c.dom.NodeList;
  10. public class Experiment9_4QueryByID {
  11. public static void main(String[] args) {
  12. System.out.println("请输入这个同学的学号:");
  13. Scanner scanner = new Scanner(System.in);
  14. String s = scanner.nextLine();
  15. try{
  16. DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance();
  17. dbf.setNamespaceAware(true);
  18. DocumentBuilder db= dbf.newDocumentBuilder();
  19. Document doc= db.parse("Students.xml");
  20. Element root=doc.getDocumentElement();
  21. String rootName=root.getNodeName();
  22. System.out.println("-----潘圣东-----");
  23. System.out.println(" 根元素名称是:"+rootName);
  24. /*NodeList namesList=doc.getElementsByTagName("姓名");
  25. int length=namesList.getLength();
  26. for(int i=0;i<length;i++){
  27. Node node=namesList.item(i);
  28. Element elementNode=(Element)node; // 将节点转换为元素节点
  29. String name=node.getTextContent();// 获得节点的文本内容
  30. String content=elementNode.getAttribute("爱好");// 获得元素节点的属性
  31. if(content!=""){
  32. System.out.print(name);
  33. System.out.println(":"+content);
  34. }
  35. }*/
  36. NodeList numberList = doc.getElementsByTagName("学号");
  37. int length = numberList.getLength();
  38. String content = null;
  39. String content2=null;
  40. boolean has = false;
  41. ArrayList<String> list = new ArrayList<String>();
  42. for(int i = 0;i<length;i++) {
  43. Node node=numberList.item(i);
  44. content=node.getTextContent();
  45. content2 = numberList.item(i).getParentNode().getTextContent();
  46. list.add(content);
  47. //System.out.println(list);
  48. //System.out.println(content);
  49. if(content.equals(s)==false) {
  50. continue;
  51. }else {
  52. System.out.println("有这个同学,这个同学的信息是:");
  53. System.out.println(content2);
  54. break;
  55. }
  56. /*if(content.equals(s)==false) {
  57. has = false;
  58. }else {
  59. has = true;
  60. System.out.println("有这个同学的信息,信息是:"+content2);
  61. }*/
  62. /*ArrayList<String> list = new ArrayList<String>();
  63. if(list.contains("201501110107")) {
  64. System.out.println("1");
  65. }else {
  66. System.out.println("0");
  67. }*/
  68. }
  69. //System.out.println(list);
  70. if(list.contains(s)) {
  71. System.out.println();
  72. }else {
  73. System.out.println("没有次学号的同学!!");
  74. }
  75. }catch(Exception e){
  76. System.out.println(e);
  77. }
  78. }
  79. }

Experiment9_5appendStudent.java

[html] view plain copy

  1. package com.xml.psd;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import javax.xml.parsers.DocumentBuilder;
  5. import javax.xml.parsers.DocumentBuilderFactory;
  6. import javax.xml.transform.OutputKeys;
  7. import javax.xml.transform.Transformer;
  8. import javax.xml.transform.TransformerFactory;
  9. import javax.xml.transform.dom.DOMSource;
  10. import javax.xml.transform.stream.StreamResult;
  11. import org.w3c.dom.Document;
  12. import org.w3c.dom.Element;
  13. public class Experiment9_5appendStudent {
  14. public static void main(String[] args) {
  15. try{
  16. DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance();
  17. dbf.setNamespaceAware(true);
  18. DocumentBuilder db= dbf.newDocumentBuilder();
  19. Document doc= db.parse("Students.xml");
  20. Element root=doc.getDocumentElement();
  21. String rootName=root.getNodeName();
  22. System.out.println("-----潘圣东-----");
  23. System.out.println(" 根元素名称是:"+rootName);
  24. /*String content=root.getTextContent();
  25. System.out.println(content);*/
  26. Element student=doc.createElement("学生");
  27. Element studentid=doc.createElement("学号");
  28. studentid.appendChild(doc.createTextNode("201511010318"));
  29. student.appendChild(studentid);
  30. Element studentName=doc.createElement("姓名");
  31. studentName.appendChild(doc.createTextNode("潘圣东"));
  32. student.appendChild(studentName);
  33. Element sex=doc.createElement("性别");
  34. sex.appendChild(doc.createTextNode("男"));
  35. student.appendChild(sex);
  36. Element studentSpc=doc.createElement("专业");
  37. studentSpc.appendChild(doc.createTextNode("未定专业"));
  38. student.appendChild(studentSpc);
  39. Element englishScore=doc.createElement("英语");
  40. englishScore.appendChild(doc.createTextNode("600"));
  41. student.appendChild(englishScore);
  42. Element mathScore=doc.createElement("数学");
  43. mathScore.appendChild(doc.createTextNode("150"));
  44. student.appendChild(mathScore);
  45. root.appendChild(student);
  46. TransformerFactory transFactory=TransformerFactory.newInstance();
  47. Transformer transformer=transFactory.newTransformer();
  48. transformer.setOutputProperty(OutputKeys.INDENT,"yes");
  49. DOMSource domSource=new DOMSource(doc);
  50. File file=new File("NewStudents.xml");
  51. FileOutputStream fos=new FileOutputStream(file);
  52. StreamResult xmlResult=new StreamResult(fos);
  53. transformer.transform(domSource,xmlResult);
  54. String content=root.getTextContent();
  55. System.out.println(content);
  56. System.out.println("插入新元素成功!");
  57. }catch(Exception e){
  58. System.out.println(e);
  59. }
  60. }
  61. }

Experiment9_6RemoveByID.java

[html] view plain copy

  1. package com.xml.psd;
  2. import java.util.ArrayList;
  3. import java.util.Scanner;
  4. import javax.xml.parsers.DocumentBuilder;
  5. import javax.xml.parsers.DocumentBuilderFactory;
  6. import org.w3c.dom.Document;
  7. import org.w3c.dom.Element;
  8. import org.w3c.dom.Node;
  9. import org.w3c.dom.NodeList;
  10. public class Experiment9_6RemoveByID {
  11. public static void main(String[] args) {
  12. System.out.println("请输入这个同学的学号:");
  13. Scanner scanner = new Scanner(System.in);
  14. String s = scanner.nextLine();
  15. try{
  16. DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance();
  17. dbf.setNamespaceAware(true);
  18. DocumentBuilder db= dbf.newDocumentBuilder();
  19. Document doc= db.parse("Students.xml");
  20. Element root=doc.getDocumentElement();
  21. String rootName=root.getNodeName();
  22. System.out.println("-----潘圣东-----");
  23. System.out.println(" 根元素名称是:"+rootName);
  24. NodeList numberList = doc.getElementsByTagName("学号");
  25. int length = numberList.getLength();
  26. String content = null;
  27. String content2=null;
  28. String content3 = null;
  29. boolean has = false;
  30. ArrayList<String> list = new ArrayList<String>();
  31. for(int i = 0;i<length;i++) {
  32. Node node=numberList.item(i);
  33. content=node.getTextContent();
  34. content2 = numberList.item(i).getParentNode().getTextContent();
  35. list.add(content);
  36. if(content.equals(s)==false) {
  37. continue;
  38. }else {
  39. //System.out.println("有这个同学,这个同学的信息是:");
  40. root.removeChild(numberList.item(i).getParentNode());
  41. break;
  42. }
  43. }
  44. String content4=root.getTextContent();
  45. System.out.println(content4);
  46. if(list.contains(s)) {
  47. System.out.println("已删除学号为"+s+"的同学!");
  48. }else {
  49. System.out.println("没有此学号的同学!!");
  50. }
  51. }catch(Exception e){
  52. System.out.println(e);
  53. }
  54. }
  55. }

Experiment9_7updateAverageGrade1.java

[html] view plain copy

  1. package com.xml.psd;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import javax.xml.parsers.DocumentBuilder;
  5. import javax.xml.parsers.DocumentBuilderFactory;
  6. import javax.xml.transform.OutputKeys;
  7. import javax.xml.transform.Transformer;
  8. import javax.xml.transform.TransformerFactory;
  9. import javax.xml.transform.dom.DOMSource;
  10. import javax.xml.transform.stream.StreamResult;
  11. import org.w3c.dom.Document;
  12. import org.w3c.dom.Element;
  13. import org.w3c.dom.Node;
  14. import org.w3c.dom.NodeList;
  15. public class Experiment9_7updateAverageGrade1 {
  16. public static void main(String[] args) {
  17. try{
  18. DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance();
  19. dbf.setNamespaceAware(true);
  20. DocumentBuilder db= dbf.newDocumentBuilder();
  21. Document doc= db.parse("Students.xml");
  22. Element root=doc.getDocumentElement();
  23. String rootName=root.getNodeName();
  24. System.out.println("-----潘圣东-----");
  25. System.out.println(" 根元素名称是:"+rootName);
  26. // Element averageGrade=doc.createElement("平均分");
  27. NodeList studentsList=doc.getElementsByTagName("学生");
  28. NodeList mathList = doc.getElementsByTagName("数学");
  29. NodeList EnglishList = doc.getElementsByTagName("英语");
  30. int length = studentsList.getLength();
  31. // System.out.println(length);
  32. for(int i=0;i<length;i++) {
  33. Node mathNode = mathList.item(i);
  34. double mathGrade =Double.parseDouble(mathNode.getTextContent());
  35. Node EnglishNode = EnglishList.item(i);
  36. double EnglishGrade = Double.parseDouble(EnglishNode.getTextContent());
  37. String s = (mathGrade+EnglishGrade)/2+"";
  38. //System.out.println(s);
  39. Element averageGrade=doc.createElement("平均分");
  40. averageGrade.appendChild(doc.createTextNode(s));
  41. Node node = studentsList.item(i);
  42. node.appendChild(averageGrade);
  43. }
  44. String content=root.getTextContent();
  45. System.out.println(content);
  46. TransformerFactory transFactory=TransformerFactory.newInstance();
  47. Transformer transformer=transFactory.newTransformer();
  48. transformer.setOutputProperty(OutputKeys.INDENT,"yes");// 添加换行符 添加换行符
  49. DOMSource domSource=new DOMSource(doc);
  50. File file=new File("studentsNew2.xml");
  51. FileOutputStream out=new FileOutputStream(file);
  52. StreamResult xmlResult=new StreamResult(out);
  53. transformer.transform(domSource,xmlResult);
  54. System.out.println("成功");
  55. }catch(Exception e){
  56. System.out.println(e);
  57. }
  58. }
  59. }

程序结果如图:

showAll.webp

用Java语言遍历读取和操纵XML文档

showAllName.webp

用Java语言遍历读取和操纵XML文档

showAllNameAndHobby.webp

用Java语言遍历读取和操纵XML文档

showUpdateAverageGrade.webp

用Java语言遍历读取和操纵XML文档

程序总结:

此次试验加深了对W3c.org.DOM的理解。掌握了java语言解析xml文件的相关的类。学会了用java程序创建节点和移除节点和查询节点等。

相关难点就是难以掌握节点的定位问题。通过getElementByTagName解决。再通过此节点的父亲节点或者是子节点来定位到所要寻找的节点。

推荐阅读