Enhanced SAX Handler : 比 DOM 还简单的SAX Handler
快速与简单并非天生不可兼得, 相反, 简单的东西应该是快速的
在使用 SAX 解析 XML 的过程中, 碰到了以下问题:
public?interface?Stoppable {
????boolean?canStop();
}
b). 缺省实现:public?abstract?class?EnhancedHandler?extends?DefaultHandler?implements?Reportable {
????private?boolean?canStop;
????public?boolean?canStop() {??return?canStop;????}
????protected?void?stop() {?canStop?=?true;?} ?//call this method when subclass objects get enough information.
}
c). 当且只当所有SAX Handler都可以停止的时候, 抛出异常:public?class?CompositeEnhancedHandler?extends?DefaultHandler {
????private?static?final?RuntimeException?SHOULD_STOP_EXCEPTION?=?new?ShouldStopParsingException();
????private?final?EnhancedHandler[]?handlers;
????public?CompositeEnhancedHandler(EnhancedHandler... handlers) {
????????this.handlers?= handlers;
????}
????public?void?characters(char[] ch,?int?start,?int?length)?throws?SAXException {
????????for?(EnhancedHandler handler :?handlers) {?handler.characters(ch, start, length);?}
????????throwExceptionIfCanStop();
????}
????public?void?endElement(String uri, String localName, String qName)?throws?SAXException {
????????for?(EnhancedHandler handler :?handlers) {?handler.endElement(uri, localName, qName);?}
????????throwExceptionIfCanStop();
????}
????public?void?startElement(String uri, String localName, String qName, Attributes attributes)?throws?SAXException {
????????for?(EnhancedHandler handler :?handlers) {?handler.startElement(uri, localName, qName, attributes);?}
????????throwExceptionIfCanStop();
????}
????private?void?throwExceptionIfCanStop() {
????????for?(EnhancedHandler handler :?handlers) {??if?(!handler.canStop()) {?return;?}?}
????????throw?SHOULD_STOP_EXCEPTION;
????}
}
d). SAX Parser 捕获异常:CompositeEnhancedHandler handler =?new?CompositeEnhancedHandler(new?Handler1(),?new?Handler2());
try?{
????SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
????saxParser.parse(new?File("england.xml"), handler);
}?catch?(ShouldStopParsingException se) {
????// All handlers got enough information, just stop parsing.
}?
?
public?interface?Subscribable {
????String subscribe();
}
public?class?CompositeEnhancedHandler?extends?DefaultHandler?{
????private?final?AddableMap?mapping?=?new?AddableMap();
????private?List<EnhancedHandler>?currentHandlers;
????public?CompositeEnhancedHandler(EnhancedHandler... handlers) {
????????... ...
????????for?(EnhancedHandler handler : handlers) {??mapping.get(handler.subscribe()).add(handler);?}
????}
????public?void?startElement(String uri, String localName, String qName, Attributes attributes)?throws?SAXException {
????????currentHandlers?=?mapping.get(qName);
????????for?(EnhancedHandler handler :?currentHandlers)?{?handler.startElement(uri, localName, qName, attributes);?}
????????... ...
????}
????public?void?characters(char[] ch,?int?start,?int?length)?throws?SAXException {????????for?(EnhancedHandler handler :?currentHandlers)?{?handler.characters(ch, start, length);?}
????????... ...
????}
?
????public?void?endElement(String uri, String localName, String qName)?throws?SAXException {
????????for?(EnhancedHandler handler :?currentHandlers)?{?handler.endElement(uri, localName, qName);?}
????????... ...
????}
????private?static?class?AddableMap {
????????private?Map<String, List<EnhancedHandler>>?container?=?new?HashMap<String, List<EnhancedHandler>>();
????????public?List<EnhancedHandler> get(String qname) {
????????????if?(!container.containsKey(qname)) {?container.put(qname,?new?ArrayList<EnhancedHandler>());?}
????????????return?container.get(qname);
????????}
????}
}
?
public?interface?Reportable {
????void?report(Map resultSet);
}
b). 缺省支持:
public?abstract?class?EnhancedHandler?extends?DefaultHandler?implements?Reportable, Stoppable, Subscribable {
????... ...
}
public?class?CompositeEnhancedHandler?extends?DefaultHandler?implements?Reportable?{
????public?void?report(Map resultSet) {
????????for?(EnhancedHandler handler :?handlers) {?handler.report(resultSet);?}
????}
}