• javaweb学习总结十二(JAXP对XML文档进行SAX解析)


    一:JAXP使用SAX方式解析XML文件

    1:dom解析与sax解析异同点

    2:sax解析特点

    二:代码案例

    1:xml文件

     1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
     2 <students>
     3     <student>
     4         <name sid="111">李四</name>
     5         <age>23</age>
     6         <gender></gender>
     7     </student>
     8     <student>
     9         <name sid="222">张三</name>
    10         <age>21</age>
    11         <gender></gender>
    12     </student>
    13 </students>

    2:测试主体部分

     1 @Test
     2     public void testParseXml() throws ParserConfigurationException,
     3             SAXException, IOException {
     4         // 1:获取解析器工厂
     5         SAXParserFactory factory = SAXParserFactory.newInstance();
     6         // 2:获取解析器
     7         SAXParser parser = factory.newSAXParser();
     8         // 3:获取读取器
     9         XMLReader reader = parser.getXMLReader();
    10         // 4:设置内容格式
    11         reader.setContentHandler(new GetSecondNameHandler());
    12         // 5:解析文件
    13         reader.parse("xml/exam.xml");
    14     }

    a:获取整个xml文档标签的处理事件

     1 // 定义一个解析全文的解析器
     2 class MyHandler implements ContentHandler {
     3 
     4     @Override
     5     public void setDocumentLocator(Locator locator) {
     6 
     7     }
     8 
     9     @Override
    10     public void startDocument() throws SAXException {
    11 
    12     }
    13 
    14     @Override
    15     public void endDocument() throws SAXException {
    16 
    17     }
    18 
    19     @Override
    20     public void startPrefixMapping(String prefix, String uri)
    21             throws SAXException {
    22 
    23     }
    24 
    25     @Override
    26     public void endPrefixMapping(String prefix) throws SAXException {
    27 
    28     }
    29 
    30     @Override
    31     public void startElement(String uri, String localName, String qName,
    32             Attributes atts) throws SAXException {
    33         System.out.println("<" + qName + ">");
    34         // 获取元素的属性
    35         for (int i = 0; i < atts.getLength(); i++) {
    36             String attrName = atts.getQName(i);
    37             String attrValue = atts.getValue(i);
    38             System.out.println(attrName + "=" + attrValue);
    39         }
    40     }
    41 
    42     @Override
    43     public void endElement(String uri, String localName, String qName)
    44             throws SAXException {
    45         System.out.println("<" + qName + "/>");
    46     }
    47 
    48     @Override
    49     public void characters(char[] ch, int start, int length)
    50             throws SAXException {
    51         System.out.println(new String(ch, start, length));
    52     }
    53 
    54     @Override
    55     public void ignorableWhitespace(char[] ch, int start, int length)
    56             throws SAXException {
    57 
    58     }
    59 
    60     @Override
    61     public void processingInstruction(String target, String data)
    62             throws SAXException {
    63 
    64     }
    65 
    66     @Override
    67     public void skippedEntity(String name) throws SAXException {
    68 
    69     }
    70 
    71 }

    b:定义“获取指定内容,获取第二个学生的名字”事件

     1 class GetSecondNameHandler extends DefaultHandler {
     2 
     3     private String contentTag;
     4     private int currentTag = 0;
     5     private int getTag = 2;
     6 
     7     @Override
     8     public void startElement(String uri, String localName, String qName,
     9             Attributes attributes) throws SAXException {
    10         contentTag = qName;
    11     }
    12 
    13     @Override
    14     public void endElement(String uri, String localName, String qName)
    15             throws SAXException {
    16         contentTag = null;
    17     }
    18 
    19     @Override
    20     public void characters(char[] ch, int start, int length)
    21             throws SAXException {
    22         if ("name".equals(contentTag)) {
    23             currentTag++;
    24             if (currentTag == getTag) {
    25                 System.out.println(new String(ch, start, length));
    26             }
    27             
    28         }
    29     }
    30 
    31 }

     c:将xml信息封装成javabean对象,然后放到list集合中

     1 / 将xml中student元素内容封装成对象,然后放到list集合中
     2 class BeanListHandler extends DefaultHandler {
     3     private List<Student> list = new ArrayList<Student>();
     4     private String tagName;
     5     private Student stu;
     6 
     7     @Override
     8     public void startElement(String uri, String localName, String qName,
     9             Attributes attributes) throws SAXException {
    10         tagName = qName;
    11         if ("student".equals(tagName)) {
    12             stu = new Student();
    13         }
    14     }
    15 
    16     @Override
    17     public void characters(char[] ch, int start, int length)
    18             throws SAXException {
    19 
    20         if ("name".equals(tagName)) {
    21             stu.setName(new String(ch, start, length));
    22         }
    23         if ("age".equals(tagName)) {
    24             stu.setAge(Integer.parseInt(new String(ch, start, length)));
    25         }
    26         if ("gender".equals(tagName)) {
    27             stu.setGender(new String(ch, start, length));
    28         }
    29 
    30     }
    31 
    32     @Override
    33     public void endElement(String uri, String localName, String qName)
    34             throws SAXException {
    35         if ("student".equals(qName)) {
    36             list.add(stu);
    37             stu = null;
    38         }
    39 
    40         tagName = null;
    41     }
    42 
    43     public List<Student> getStudents() {
    44         return list;
    45     }
    46 
    47 }

    测试程序代码修改为:

     1 @Test
     2     public void testParseXml() throws ParserConfigurationException,
     3             SAXException, IOException {
     4         // 1:获取解析器工厂
     5         SAXParserFactory factory = SAXParserFactory.newInstance();
     6         // 2:获取解析器
     7         SAXParser parser = factory.newSAXParser();
     8         // 3:获取读取器
     9         XMLReader reader = parser.getXMLReader();
    10         // 4:设置内容格式
    11         BeanListHandler beanListHandler = new BeanListHandler();
    12         reader.setContentHandler(beanListHandler);
    13         // 5:解析文件
    14         reader.parse("xml/exam.xml");
    15 
    16         List<Student> list = beanListHandler.getStudents();
    17         for (Student stu : list) {
    18             System.out.println("name=" + stu.getName() + "  age=" + stu.getAge()
    19                     + " gender=" + stu.getGender());
    20         }
    21     }
  • 相关阅读:
    [转]windows Mobile使用ActiveSync上网
    C++剪切板操作
    jdk1.8源码分析hashMap
    【杂项】VMware 虚拟机安装ubuntu 16.04教程
    【Linux命令】数据流重定向
    【ceph | 运维】crush相关命令
    【Linux命令】更改hostname
    【Linux命令】sed命令
    【Linux命令】vim基本快捷键
    【Linux命令】install
  • 原文地址:https://www.cnblogs.com/warrior4236/p/5861576.html
Copyright © 2020-2023  润新知