因为最近要练习手写WebServer服务器,里面需要用到XML解析,
发现以前没有编写过解析XML解析的博文,今天就补一下。
XML解析方式
- DOM解析
- SAX解析
- JDOM解析
- DOM4J解析
今天这种方式只写出SAX解析的方式:
优点:
解析速度快,
占用内存少,
缺点:
只能读取XML,
不能修改XML,
不能知道当前解析的节点。
我在这使用SAX解析总结了几个步骤:
- 创建一个SAX解析工厂对象
- 通过工厂对象获取一个XML解析器
- 我们可以通过解析器的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,刚刚忘记写了