本示例将向您展示如何使用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}