因为最近要练习手写 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, 通过重写这个类的方法来进行解析节点
代码环节
- // 获取一个 SAX 解析工厂
- SAXParserFactory factory = SAXParserFactory.newInstance();
- // 获取解析器
- SAXParser parser = factory.newSAXParser();
- // 创建 Handler 的解析类
- PHandler pHandler = new PHandler();
- // 通过 parse 方法来指定解析的文件和解析类
- parser.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("net/cncandy/parsexml/p.xml"), pHandler);
这里的 getResourceAsStream 的参数时, 如果这个文件放在了包里面, 这里所填写的参数应该是将包名中的点换成 / 就可以了, 记得加上 xml 文件名
上面所说的 PHandler 是我们直接写的一个类, 这个类是继承的 DefaultHandler 类, 我们需要实现里面的几个方法, 我们先来介绍下我们需要的方法.
startDocument | 接收文件开头的通知,默认情况下,什么也不做。 应用程序编写者可以在子类中覆盖此方法,以在文档的开头执行特定操作 |
startElement | 接收元素开始的通知,默认情况下,什么也不做。 应用程序编写者可以在子类中覆盖此方法,以在每个元素的开始处采取特定的操作 |
characters | 接收元素内的字符数据通知。 可以通过 new String 的方式将 ch 转换成字符串输出 |
endElement | 接收元素结尾的通知。 默认情况下,什么也不做。 应用程序编写者可以在子类中覆盖此方法,以在每个元素的末尾执行特定操作(例如,完成树节点或将输出写入文件)。 |
endDocument | 接收文件结尾的通知。 默认情况下,什么也不做。 应用程序编写者可以在子类中覆盖此方法,以在文档的末尾执行特定操作 |
- class PHandler extends DefaultHandler{
- // 开始解析文档
- @Override
- public void startDocument() throws SAXException {
- System.out.println("开始解析文档");
- }
- // 开始解析元素
- @Override
- public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
- }
- @Override
- public void characters(char[] ch, int start, int length) throws SAXException {
- String string = new String(ch,start,length).trim();
- if(string.length()>0) {
- System.out.println(string);
- }
- }
- // 结束解析元素
- @Override
- public void endElement(String uri, String localName, String qName) throws SAXException {
- }
- // 结束解析文档
- @Override
- public void endDocument() throws SAXException {
- System.out.println("结束解析文档");
- }
- }
xml 节点表, George 是 characters, 刚刚忘记写了
来源: http://www.bubuko.com/infodetail-3105905.html