Java基础之XML解析

因为最近要练习手写WebServer服务器,里面需要用到XML解析,

发现以前没有编写过解析XML解析的博文,今天就补一下。

XML解析方式

  • DOM解析
  • SAX解析
  • JDOM解析
  • DOM4J解析

今天这种方式只写出SAX解析的方式:

    优点:

      解析速度快,

      占用内存少,

    缺点:

      只能读取XML,

      不能修改XML,

      不能知道当前解析的节点。

我在这使用SAX解析总结了几个步骤:

  1. 创建一个SAX解析工厂对象
  2. 通过工厂对象获取一个XML解析器
  3. 我们可以通过解析器的parse方法来进行xml解析

      parse(InputStream is, HandlerBase hb) 

      参数一:这里是一个字节输入流,我们这里可以通过类加载器的getResourceAsStream方法来进行指定xml的文件

      参数二:要使用的SAX HandlerBase,这个定义的Handle需要继承DefaultHandler,通过重写这个类的方法来进行解析节点

代码环节

1 //获取一个SAX解析工厂
2 SAXParserFactory factory = SAXParserFactory.newInstance();
3 //获取解析器
4 SAXParser parser = factory.newSAXParser();
5 //创建Handler的解析类
6 PHandler pHandler = new PHandler();
7 //通过parse方法来指定解析的文件和解析类
8 parser.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("net/cncandy/parsexml/p.xml"), pHandler);

这里的getResourceAsStream的参数时,如果这个文件放在了包里面,这里所填写的参数应该是将包名中的点换成/就可以了,记得加上xml文件名

上面所说的PHandler是我们直接写的一个类,这个类是继承的DefaultHandler类,我们需要实现里面的几个方法,我们先来介绍下我们需要的方法。

startDocument 接收文件开头的通知,默认情况下,什么也不做。 应用程序编写者可以在子类中覆盖此方法,以在文档的开头执行特定操作
startElement 接收元素开始的通知,默认情况下,什么也不做。 应用程序编写者可以在子类中覆盖此方法,以在每个元素的开始处采取特定的操作
characters 接收元素内的字符数据通知。 可以通过new String的方式将ch转换成字符串输出
endElement 接收元素结尾的通知。 默认情况下,什么也不做。 应用程序编写者可以在子类中覆盖此方法,以在每个元素的末尾执行特定操作(例如,完成树节点或将输出写入文件)。 
endDocument 接收文件结尾的通知。 默认情况下,什么也不做。 应用程序编写者可以在子类中覆盖此方法,以在文档的末尾执行特定操作
 1 class PHandler extends DefaultHandler{
 2     //开始解析文档
 3     @Override
 4     public void startDocument() throws SAXException {
 5         System.out.println("开始解析文档");
 6     }
 7     
 8     //开始解析元素
 9     @Override
10     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
11 
12     }
13     
14     @Override
15     public void characters(char[] ch, int start, int length) throws SAXException {
16         String string = new String(ch,start,length).trim();
17         if(string.length()>0) {
18             System.out.println(string);
19         }
20         
21     }
22     
23     //结束解析元素
24     @Override
25     public void endElement(String uri, String localName, String qName) throws SAXException {
26 
27     }
28     
29     //结束解析文档
30     @Override
31     public void endDocument() throws SAXException {
32         System.out.println("结束解析文档");
33     }
34 }

XML节点表,George是characters,刚刚忘记写了

猜你喜欢

转载自www.cnblogs.com/mCarrYoung/p/11099699.html