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>