当前位置:编程学习 > JSP >>

解析器的使用(JAXP)

答案:分析器的使用(一)

作者: 常明 写作日期:2000-4-26



简介
这组文章主要就目前有的XML分析器分别介绍一下他们的接口和用法。
其中包括SUN的XML分析器,IBM的分析器XML4J,XML4C,ORACLE的分析器,EXPAT。
SUN的JAXP
JAXP API全部包括在JAXP.JAR中,它有两个工厂类 SAXParserFactory和DocumentBuilderFactory 分别对应SAX接口和DOM接口。
这两个工厂类的作用是,通过设定其中的属性创建合适的分析器,它可以配合各种分析器的具体实现一起使用。这就是说SAXParserFactor可以和任何符合SAX接口的PARSER一起用,不一定就是SUN的分析器;DocumentBuidlerFactory也一样,不一定用SUN的实现。对于sax只要parser是实现org.xml.sax.Parser接口的,对于DOM就是文档对象实现了 org.w3c.dom.*的接口。
SUN的分析器的实现是com.sun.xml.parser,它是实现了sax接口的,它的DOM实现则是基于SAX的,所以他们的分析器是一个。
下面介绍DOM的编程,首先要引入以下JAXP API定义:
import javax.xml.parsers.DocumentBuilderFactory;  
import javax.xml.parsers.FactoryConfigurationError;  
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.DocumentBuilder;
如果要处理SAX异常加入:
import org.xml.sax.SAXException;  
import org.xml.sax.SAXParseException;
文件I/O:
import java.io.File;
import java.io.IOException;
如果要处理DOM异常加入:
import org.w3c.dom.Document;
import org.w3c.dom.DOMException;
程序如下,声明一个静态全局的DOM的Document,方便下面的处理,Document可以从文件装入,写可以通过程序写入,否则是空的。
public class DomEcho
{    
    static Document document;

    public static void main (String argv [])
    {
        ...
    }

在分析过程中的异常处理的程序如下,这里有四种异常的处理:
public static void main (String argv [])
{
    if (argv.length != 1) {
        ...
    }

    try {

    } catch (SAXParseException spe) {
       // Error generated by the parser
       System.out.println ("\n** Parsing error"
          + ", line " + spe.getLineNumber ()
          + ", uri " + spe.getSystemId ());
       System.out.println("   " + spe.getMessage() );

       // Use the contained exception, if any
       Exception  x = spe;
       if (spe.getException() != null)
           x = spe.getException();
       x.printStackTrace();

    } catch (SAXException sxe) {
       // Error generated by this application
       // (or a parser-initialization error)
       Exception  x = sxe;
       if (sxe.getException() != null)
           x = sxe.getException();
       x.printStackTrace();

    } catch (ParserConfigurationException pce) {
       // Parser with specified options //can t be built
       pce.printStackTrace();

    } catch (IOException ioe) {
       // I/O error
       ioe.printStackTrace();
    }

}// main
生成分析器,有两步,首先实例化工厂,再由工厂生成DocumentBuilder,最后开始分析:
    DocumentBuilderFactory factory =  DocumentBuilderFactory.newInstance();
try {
   DocumentBuilder builder =  factory.newDocumentBuilder();
   document = builder.parse( new File(argv[0]) );

} catch (SAXParseException spe) {

有了Document对象后就可以做各种DOM操作,以下程序输出XML:
XmlDocument xdoc = (XmlDocument) document;
  xdoc.write (System.out);

如果要使用SAX接口程序就稍复杂一些,首先引入定义:
import java.io.*;
import org.xml.sax.*;
import javax.xml.parsers.SAXParserFactory;  
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;


和DOM的编程相似,首先一样实例化DocumentBuilderFactory,创建一个SAXParser,然后开始分析,期间处理各种异常:
    public static void main (String argv [])

    {
        if (argv.length != 1) {
            System.err.println (  "Usage: cmd filename");
            System.exit (1);
        }

        // Use the default (non-validating) parser
        SAXParserFactory factory =   SAXParserFactory.newInstance();
        try {
         NoAction noaction;    
            // Parse the input
            SAXParser saxParser =  factory.newSAXParser();
            saxParser.setDocumentHandler(noaction);
            saxParser.parse(  new File(argv [0]), new Echo() );

        } catch (Throwable t) {
            t.printStackTrace ();
        }
        System.exit (0);
    }
但用SAX是通过处理事件来进行的,所以在分析之前,一般要设定处理器,使用saxparser的SetDocumentHandler方法来设定。 下面是一个什么都不做的事件处理器,它实现了DocumentHandler接口。
class NoAction implement DocumentHandler{
    ...   
   public void startDocument ()
    throws SAXException
    {
    }

    public void endDocument ()
    throws SAXException
    {
    }

    public void startElement (String name, AttributeList attrs)
    throws SAXException
    {
    }

    public void endElement (String name)
    throws SAXException
    {
    }

    public void characters (char buf [], int offset, int len)
    throws SAXException
    {
    }
     ...
以上就基本介绍了sun的xml分析器的使用,有任何问题请发mail给我们一起讨论。

上一个:SAX编程入门
下一个:J2ME常用名字解释 转

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,