XML SAX解析xml文件

缺乏、安全感 2022-06-08 10:08 439阅读 0赞

SAX解析xml文件

一、student.xml(解析的文件)

  1. <?xml version="1.0" encoding="utf-8" ?><!--xml文档声明-->
  2. <!--DTD约束-->
  3. <!DOCTYPE class [
  4. <!ELEMENT student (name,age,sex,height)>
  5. <!ELEMENT name (#PCDATA)>
  6. <!ELEMENT age (#PCDATA)>
  7. <!ELEMENT sex (#PCDATA)>
  8. <!ELEMENT height (#PCDATA)>
  9. ]>
  10. <!--只能有一个根标签-->
  11. <class>
  12. <!--设置属性-->
  13. <student id="1" user="lisi">
  14. <name>李四</name>
  15. <age>18</age>
  16. <sex></sex>
  17. <height>182</height>
  18. </student>
  19. <student id="2" user="wangwu">
  20. <name>王五</name>
  21. <age>19</age>
  22. <sex></sex>
  23. <height>172</height>
  24. </student>
  25. </class>

二、解析代码(SAXParseMain.java)

  1. package com.xml.main;
  2. import org.xml.sax.Attributes;
  3. import org.xml.sax.SAXException;
  4. import org.xml.sax.helpers.DefaultHandler;
  5. import javax.xml.parsers.ParserConfigurationException;
  6. import javax.xml.parsers.SAXParser;
  7. import javax.xml.parsers.SAXParserFactory;
  8. import java.io.IOException;
  9. import java.util.ArrayList;
  10. public class SAXParseMain {
  11. public static void main(String[] args) {
  12. try {
  13. //步骤一:创建SAX解析工厂实例
  14. SAXParserFactory factory = SAXParserFactory.newInstance();
  15. //步骤二:通过工厂创建一个SAX解析器
  16. SAXParser sax = factory.newSAXParser();
  17. MyHandler myHandler = new MyHandler();
  18. //步骤三:指定用相应的解析器开始解析XML文档
  19. sax.parse("student.xml", myHandler);
  20. ArrayList<Student> list = myHandler.getList();
  21. for (int i = 0; i < list.size(); i++) {
  22. Student student = list.get(i);
  23. System.out.println(student.toString());
  24. }
  25. } catch (ParserConfigurationException e) {
  26. e.printStackTrace();
  27. } catch (SAXException e) {
  28. e.printStackTrace();
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. } finally {
  32. }
  33. }
  34. }
  35. //指定解析处理器,编写解析规则
  36. class MyHandler extends DefaultHandler {
  37. ArrayList<Student> list = new ArrayList<>();
  38. public ArrayList<Student> getList() {
  39. return list;
  40. }
  41. private Student student;
  42. private String target = "";
  43. // 解析到文档的开始
  44. @Override
  45. public void startDocument() throws SAXException {
  46. }
  47. // 解析到开始的元素节点(包括根节点)
  48. /**
  49. * @param uri 命名空间
  50. * @param localName 元素名称【不支持了】
  51. * @param qName [前缀:]元素名称(没有命名空间就不存在前缀)
  52. * @param attributes 属性集
  53. * @throws SAXException 异常
  54. */
  55. @Override
  56. public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
  57. if ("student".equals(qName)) {
  58. student = new Student();
  59. String id = attributes.getValue("id");
  60. String user = attributes.getValue("user");
  61. student.setId(Integer.parseInt(id));
  62. student.setUser(user);
  63. }
  64. target = qName;
  65. }
  66. /**
  67. * 解析到文本内容(包括回车,空格,换行)
  68. *
  69. * @param ch SAX并不是把整个文档加载到内存中,SAX会把解析到的内容缓存起来(缓存8192字节),char[] ch就是解析到的缓存内容
  70. * @param start 遇到文本的开始字符位置
  71. * @param length 当前整个文本从一个标签到下一个标签的长度
  72. * @throws SAXException
  73. */
  74. @Override
  75. public void characters(char[] ch, int start, int length) throws SAXException {
  76. String content = new String(ch, start, length);
  77. switch (target) {
  78. case "name":
  79. student.setName(content);
  80. break;
  81. case "age":
  82. student.setAge(Integer.parseInt(content));
  83. break;
  84. case "sex":
  85. student.setSex(content);
  86. break;
  87. case "height":
  88. student.setHeight(Double.parseDouble(content));
  89. break;
  90. }
  91. }
  92. /**
  93. * 解析到结束的元素节点
  94. *
  95. * @param uri
  96. * @param localName
  97. * @param qName
  98. * @throws SAXException
  99. */
  100. @Override
  101. public void endElement(String uri, String localName, String qName) throws SAXException {
  102. if ("student".equals(qName)) {
  103. list.add(student);
  104. }
  105. target = "";
  106. }
  107. /**
  108. * 解析到文档的结束
  109. *
  110. * @throws SAXException
  111. */
  112. @Override
  113. public void endDocument() throws SAXException {
  114. }
  115. }

三、Student.java

  1. package com.xml.main;
  2. public class Student {
  3. private int id;
  4. private String user;
  5. private String name;
  6. private String sex;
  7. private int age;
  8. private double height;
  9. public Student() {
  10. }
  11. public Student(int id, String user, String name, String sex, int age, double height) {
  12. this.id = id;
  13. this.user = user;
  14. this.name = name;
  15. this.sex = sex;
  16. this.age = age;
  17. this.height = height;
  18. }
  19. public int getId() {
  20. return id;
  21. }
  22. public void setId(int id) {
  23. this.id = id;
  24. }
  25. public String getUser() {
  26. return user;
  27. }
  28. public void setUser(String user) {
  29. this.user = user;
  30. }
  31. public String getName() {
  32. return name;
  33. }
  34. public void setName(String name) {
  35. this.name = name;
  36. }
  37. public String getSex() {
  38. return sex;
  39. }
  40. public void setSex(String sex) {
  41. this.sex = sex;
  42. }
  43. public int getAge() {
  44. return age;
  45. }
  46. public void setAge(int age) {
  47. this.age = age;
  48. }
  49. public double getHeight() {
  50. return height;
  51. }
  52. public void setHeight(double height) {
  53. this.height = height;
  54. }
  55. @Override
  56. public String toString() {
  57. return "Student{" +
  58. "id=" + id +
  59. ", user='" + user + '\'' +
  60. ", name='" + name + '\'' +
  61. ", sex='" + sex + '\'' +
  62. ", age=" + age +
  63. ", height=" + height +
  64. '}';
  65. }
  66. }

四、解析结果

Center

注:读边解析,应用于大型XML文档

发表评论

表情:
评论列表 (有 0 条评论,439人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SAX解析XML

    *下面是SAX解析XML的示例,包括三个文件employee.xml、Employee.java、SaxEmployee.java** **1.被解析的employee...

    相关 SAX解析XML

    SAX(Simple API for XML)也是一种解析 XML 文件的方法,它虽然不是官方标准,但它是 XML 的事实标准,大部分 XML 解析器都支持它。 SAX 与

    相关 Java——SAX解析XML文件

    SAX适用于只读取XML文件内容的情况,因为SAX是一种边读边解析的模式,所以不需要直接将XML文件直接塞入内存,读取速度也更快,但是只能读。 SAX解析主要有两个部分:①

    相关 SAX解析XML

    SAX(Simple API for XML)也是一种解析 XML 文件的方法,它虽然不是官方标准,但它是 XML 的事实标准,大部分 XML 解析器都支持它。 SAX ...