分析器的使用(一)
作者: 常明 写作日期: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 Exceptionx = spe; if (spe.getException() != null) x = spe.getException(); x.printStackTrace();
} catch (SAXException sxe) { // Error generated by this application // (or a parser-initialization error) Exceptionx = 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给我们一起讨论。
|