SAX也是Java官方提供的解析XML的工具之一,使用SAX解析XML不需要导入额外的包。个人觉得使用SAX解析相对麻烦一些(包括使用DOM也是)。废话不多说,还是以demo.xml为例,直接上代码:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="person1" >
<name>simons</name>
<sex>男</sex>
<age>24</age>
<address>魔都</address>
</person>
<person id="person2" >
<name>rose</name>
<sex>女</sex>
<age>22</age>
<address>帝都</address>
</person>
</persons>
使用SAX需要额自定义Handler继承DefaultHandler,重写相应的方法逻辑
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.util.ArrayList;
import java.util.List;
public class SaxParseHandler extends DefaultHandler {
Person person = null;
String value = null;
private List<Person> personList = new ArrayList<>();
public List<Person> getPersonList() {
return personList;
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
//解析person节点属性值
if (qName.equals("person")) {
person = new Person();
int attrLength = attributes.getLength();
for (int i = 0; i < attrLength; i++) {
String qName1 = attributes.getQName(i);
String value = attributes.getValue(i);
System.out.println(qName1 + ":" + value);
}
} else if (!qName.equals("persons") && !qName.equals("person")) {
System.out.print("节点名称=" + qName);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if(qName.equals("person")){
personList.add(person);
person=null;
}else if (qName.equals("name")) {
person.setName(value);
} else if (qName.equals("sex")) {
person.setSex(value);
} else if (qName.equals("age")) {
person.setAge(value);
} else if (qName.equals("address")) {
person.setAddress(value);
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
value = new String(ch, start, length);
if (!value.trim().equals("")) {
System.out.println("节点值=" + value);
}
}
public static SaxParseHandler newInstance() {
return new SaxParseHandler();
}
}
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class SaxParseXml {
public static void main(String[] args) throws Exception {
SAXParserFactory saxParserFactory =SAXParserFactory.newInstance();
SAXParser saxParser = saxParserFactory.newSAXParser();
SaxParseHandler saxParseHandler = SaxParseHandler.newInstance();
//你也可以将demo.xml放在resources目录下,然后通过下面方式获取
//InputStream resourceAsStream = SaxParseXml .class.getClassLoader().getResourceAsStream("demo.xml");
//saxParser.parse(resourceAsStream,saxParseHandler);
saxParser.parse("D:/demo.xml",saxParseHandler);
System.out.println(saxParseHandler.getPersonList().toString());
}
}
下面的@Data是lombok里面的,如果你没有使用过,请移步这里:https://blog.csdn.net/fanrenxiang/article/details/78319711
import lombok.Data;
@Data
public class Person {
private String name;
private String age;
private String sex;
private String address;
}
运行上述代码,结果如下:
id:person1
节点名称=name节点值=simons
节点名称=sex节点值=男
节点名称=age节点值=24
节点名称=address节点值=魔都
id:person2
节点名称=name节点值=rose
节点名称=sex节点值=女
节点名称=age节点值=22
节点名称=address节点值=帝都
[Person(name=simons, age=24, sex=男, address=魔都), Person(name=rose, age=22, sex=女, address=帝都)]
顺利解析demo.xml,并把解析后的数据封装到了集合中。
引申阅读:
使用JDOM解析XML:https://blog.csdn.net/fanrenxiang/article/details/81100740
使用DOM4J解析XML:https://blog.csdn.net/fanrenxiang/article/details/81099346
使用DOM解析XML:https://blog.csdn.net/fanrenxiang/article/details/81078854