本示例将向您展示如何使用SAX解析器解析XML文件并从解析的XML构建对象图。我们将读取records.xml包含一些记录信息的文件,并Record从中创建对象。
将DefaultHandler在本例中为匿名类创建。我们覆盖相关的一些方法ContentHandler接口,比如startElement,endElement和characters方法。
package org.nhooo.example.xml;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class SAXDataDemo {
// 我们的记录数据列表。
private List<Record> records = new ArrayList<Record>();
// 用于存储元素和对象的堆栈。
private Stack<String> elements = new Stack<String>();
private Stack<Record> objects = new Stack<Record>();
public static void main(String[] args) {
SAXDataDemo demo = new SAXDataDemo();
demo.run();
}
private void run() {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
String filename = "/records.xml";
InputStream is = getClass().getResourceAsStream(filename);
parser.parse(is, new DefaultHandler() {
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
elements.push(qName);
if ("record".equals(qName)) {
Record record = new Record();
objects.push(record);
records.add(record);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
elements.pop();
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String value = new String(ch, start, length);
if (value.length() == 0) {
return;
}
if ("title".equals(currentElement())) {
Record record = objects.peek();
record.setTitle(value);
} else if ("artist".equals(currentElement())) {
Record record = objects.peek();
record.setArtist(value);
} else if ("genre".equals(currentElement())) {
Record record = objects.peek();
record.setGenre(value);
} else if ("year".equals(currentElement())) {
Record record = objects.peek();
record.setYear(Integer.valueOf(value));
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
for (Record record : records) {
System.out.println("record = " + record);
}
}
private String currentElement() {
return elements.peek();
}
}记录类。
package org.nhooo.example.xml;
public class Record {
private String title;
private String artist;
private String genre;
private int year;
public Record() {
}
public void setTitle(String title) {
this.title = title;
}
public void setArtist(String artist) {
this.artist = artist;
}
public void setGenre(String genre) {
this.genre = genre;
}
public void setYear(int year) {
this.year = year;
}
@Override
public String toString() {
return "Record{" +
"title='" + title + "'n" +
", artist='" + artist + "'n" +
", genre='" + genre + "'n" +
", year=" + year +
'}';
}
}以下XML是我们records.xml文件的内容。
<?xml version="1.0"?> <root> <records> <record> <title>Brand New Eyes</title> <artist>Paramore</artist> <genre>Punk Rock</genre> <year>2011</year> </record> <record> <title>Rock Beatles</title> <artist>Various Artist</artist> <genre>Rock</genre> <year>2010</year> </record> </records> </root>
当我们运行此示例时,将获得以下输出:
record = Record{title='Brand New Eyes'
, artist='Paramore'
, genre='Punk Rock'
, year=2011}
record = Record{title='Rock Beatles'
, artist='Various Artist'
, genre='Rock'
, year=2010}