XML的SAX解析

XML是一种可扩展标记语言,可以在XML文件中存储参数,可以用于当做配置文件来使用。

解析XML文件时,解析文档类需要继承DefaultHandler类,并需要重写startElement()、characters()等方法。在处理文件时需要注意空格的问题。实际上解析XML文件时是以“流”的形式解析。它会把空格当做文件的内容来解析,所以必须要对空格、空行进行处理,防止覆盖原来的信息。

package webserver.test01;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.List;

/**
 * 熟悉SAX解析流程
 * 
 * @author zhaoy
 *
 */
public class XmlTest01 {
	public static void main(String[] args) throws Exception {
		// SAX解析
		// 1 获取解析工厂
		SAXParserFactory factory = SAXParserFactory.newInstance();
		// 2:从解析工厂中获取解析器
		SAXParser parse = factory.newSAXParser();
		// 3:编写处理器
		// 4:加载文档Document注册处理器
		PHandler handler = new PHandler();
		// 5:解析
		parse.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("webserver/test01/p.xml"),
				handler);
		List<Person> persons = handler.getPersons();
		for (Person per : persons) {
			System.out.println(per.getName() + "-->" + per.getAge());
		}
	}
}

class PHandler extends DefaultHandler {
	private List<Person> persons;
	private String tag = null;
	private Person person;

	@Override
	public void startDocument() throws SAXException {
		persons = new ArrayList<>();
	}

	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		tag = qName;
		if (tag != null) {
			if (tag.equals("person")) {
				person = new Person();
			}
		}
	}

	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		String contents = new String(ch, start, length);
		if (tag != null) {
			if (tag.equals("name")) {
				person.setName(contents);
			} else if (tag.equals("age")) {
				person.setAge(Integer.parseInt(contents));
			}
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		if (qName != null) {
			if (qName.equals("person")) {
				persons.add(person);
			}
		}
		tag = null;
	}

	@Override
	public void endDocument() throws SAXException {
	}

	public List<Person> getPersons() {
		return persons;
	}
}
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
    <person>
      <name>张三</name>
      <age>90</age>
   </person>
   <person>
      <name>李四</name>
      <age>70</age>
   </person>
</persons>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值