SAX之内容处理Java类详解编程语言

为了让应用程序有效地处理XML数据,你必须向SAX解析器注册处理程序。处理程序也称Handler接口,是由SAX定义的一组回调方法组成的,这些方法使你可以在相关的事件发生时对其进行编程。

在SAX2.0中定义了四大核心接口:org.xml.sax.ContentHandler,org.xml.sax.ErrorHandler,org.xml.sax.DTDHandler以及org.xml.sax.EntityResolver。

其于SAX的XML应用程序必须实现一个或多个Handler接口,并为Handler接口中的回调方法编程(如果你不想添加代码,也可以不写,这样就可以忽略这种类型的事件)。然后使用XMLReader中的setContentHandler(),setErrorHandler(),setDTDHandler()和setEntityResolver()方法进行注册即可。在解析过程中,reader会在合适的处理类中调用这些回调方法。

我们将从实现ContentHandler接口开始讲解,ContentHandler,顾名思义,表示的是与XML文档内容处理有关的事件,如元素,属性,字符数据等。示例:

package xml; 
 
import java.io.File; 
import java.io.FileInputStream; 
import org.xml.sax.Attributes; 
import org.xml.sax.ContentHandler; 
import org.xml.sax.InputSource; 
import org.xml.sax.Locator; 
import org.xml.sax.SAXException; 
import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.XMLReaderFactory; 
 
public class ParseXML1 { 
    public static void main(String[] args) { 
        try { 
                    XMLReader reader = XMLReaderFactory.createXMLReader(); 
                    reader.setContentHandler(new MyContentHandler());    //注册 
                    reader.parse(new InputSource(new FileInputStream( 
                            new File("/home/fuhd/apk/gw/com.application.zomato.apk/AndroidManifest.xml")))); 
                } catch (SAXException e1) { 
                    e1.printStackTrace(); 
                } catch(Exception e2){ 
                    e2.printStackTrace(); 
                } 
    } 
} 
 
//Handler接口实现,这里没有实现什么内容,稍后实现 
class MyContentHandler implements ContentHandler { 
    @Override 
        public void setDocumentLocator(Locator locator) { 
            // TODO Auto-generated method stub 
        } 
    @Override 
        public void startDocument() throws SAXException { 
            // TODO Auto-generated method stub 
        } 
    @Override 
        public void endDocument() throws SAXException { 
            // TODO Auto-generated method stub 
             
        } 
    @Override 
        public void startPrefixMapping(String prefix, String uri) 
                        throws SAXException { 
            // TODO Auto-generated method stub 
             
        } 
    @Override 
        public void endPrefixMapping(String prefix) throws SAXException { 
            // TODO Auto-generated method stub 
             
        } 
    @Override 
        public void startElement(String uri, String localName, String qName, 
                        Attributes atts) throws SAXException { 
            // TODO Auto-generated method stub 
             
        } 
    @Override 
        public void endElement(String uri, String localName, String qName) 
                        throws SAXException { 
            // TODO Auto-generated method stub 
             
        } 
    @Override 
        public void characters(char[] ch, int start, int length) 
                        throws SAXException { 
            // TODO Auto-generated method stub 
             
        } 
    @Override 
        public void ignorableWhitespace(char[] ch, int start, int length) 
                        throws SAXException { 
            // TODO Auto-generated method stub 
             
        } 
    @Override 
        public void processingInstruction(String target, String data) 
                        throws SAXException { 
            // TODO Auto-generated method stub 
             
        } 
    @Override 
        public void skippedEntity(String name) throws SAXException { 
            // TODO Auto-generated method stub 
             
        } 
}

文档定位器

第一个需要实现的回调方法是setDocumentLocator(),它用于设置在其他SAX事件中需要使用的org.xml.sax.Locator对象。当某个回调事件被触发时,实现了SAX解析器处理接口的类通常需要在XML文件中找到相应的位置。Locator类有几个很有用的方法,例如getLineNumber()和getColumnNumber(),它们可以返回调用时正在解析的XML文档的位置。例:

class MyContentHandler implements ContentHandler { 
    private Locator locator; 
    @Override 
    public void setDocumentLocator(Locator locator) { 
        this.locator = locator; 
    } 
    //...........其它回调方法............... 
}

警告:Locator实例只能在ContentHandler实现的作用域范围内使用,在解析过程外,使用Locator对象,其结果是难以预料的(也是无用的)。

文档解析的开始和结束

任何处理过程都有开始和结束。这两个重要的事件都只会发生一次:前者在所有其他解析事件发生之前发生,而后者则是在所有解析事件之后发生。SAX提供了回调方法:startDocument()和endDocument()来表示这些事件。

startDocument()方法在所有其他解析事件的回调方法之前被调用,这样就保证了解析有一个明确的起始点。endDocument()在所有处理类中总是最后被调用的方法,即使在发生错误从而导致解析被终止的情况下也是如此。注意:若有不可恢复的错误发生,则ErrorHandler类的回调方法就会被调用,最后再调用endDocument()方法结束解析过程。示例代码:

@Override 
public void startDocument() throws SAXException { 
    // TODO Auto-generated method stub 
} 
@Override 
public void endDocument() throws SAXException { 
    // TODO Auto-generated method stub 
 }

示例代码中,无需对这些方法进行任何处理,但因为实现了ContentHandler接口,因而仍给出方法的实现。

处理指令

来自:http://my.oschina.net/fhd/blog/367402

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/10921.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论