SAX方式解析XML文件
程序员文章站
2022-06-16 12:07:44
...
SAX,全称Simple API for XML,是一种以事件驱动的 XML API,SAX 与 DOM 不同的是它边扫描边解析, 自顶向下依次解析, 由于边扫描边解析, 所以它解析 XML 具有速度快, 占用内存少的优点。
SAX解析XML的步骤
- 创建SAXParserFactory对象
- 通过SAXParserFactory对象创建SAXParser对象
- 创建DefaultHandler的子类
- 调用parse()方法
XML文件
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="1001">
<name>oracle</name>
<author>WXZ</author>
<price>15</price>
</book>
<book id="1002">
<name>mysql</name>
<author>Ning</author>
<price>36.5</price>
</book>
</books>
DefaultHandler的子类
class BookDefaultHandler extends DefaultHandler{
/**
* 解析XML文件开始时调用
* @throws SAXException
*/
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("解析XML文件开始");
}
/**
* 解析XML文件结束时调用
* @throws SAXException
*/
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("解析XML文件结束");
}
/**
* 解析XML文件中的节点时调用
* @param uri
* @param localName
* @param qName
* @param attributes
* @throws SAXException
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if("book".equals(qName)){
//获取所有属性的长度
int length = attributes.getLength();
//遍历属性
for(int i = 0; i < length; i++){
String name = attributes.getQName(i);
String value = attributes.getValue(i);
System.out.println("属性名:"+name+"\t属性值:"+value);
}
}else if(!"books".equals(qName) && !"book".equals(qName)){
System.out.print("节点名:"+qName+"\t");
}
}
/**
* 解析XML文件中的节点结束时调用
* @param uri
* @param localName
* @param qName
* @throws SAXException
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
}
/**
* 获取节点值
* @param ch
* @param start
* @param length
* @throws SAXException
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
String value = new String(ch,start,length);
if(!"".equals(value.trim())){
System.out.println("节点值:"+value);
}
}
}
解析过程
/**
* SAX解析XML
*/
public class SaxXML {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//(1)创建SAXParserFactory对象
SAXParserFactory saxParserFactory = new SAXParserFactoryImpl();
//(2)通过SAXParserFactory对象创建SAXParser对象
SAXParser parser = saxParserFactory.newSAXParser();
//(3)创建DefaultHandler的子类
BookDefaultHandler bookDefaultHandler = new BookDefaultHandler();
//(4)调用parse()方法
parser.parse("book.xml",bookDefaultHandler);
}
}
运行结果:
上一篇: 帮忙解决下数组的有关问题!(初学者问.)
下一篇: php读取配置文件的代码一例