服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java & xml基础学习笔记 sax篇


  1、需要软件
  java,解析器(例如xerces),api(例如sax,dom)
  
  2、sax机制
  1)解析
  string xmluri = "c:/test.xml";
  string vendorparserclass = "org.apache.xerces.parsers.saxparser";
  xmlreaer reader = xmlreaderfactory.createxmlreader(vendorparserclass);
  
  inputsource inputsource = new inputsource(xmluri);
  reader.parse(inputsource);
  
  这样一个xml文档解析过程就完成了。因为sax是采用时间处理机制来解析xml
  文档的,在解析过程中会触发一些事件,也就是执行特定的方法,你可以实现
  这些方法,就可以通过解析xml来做一些事情了
  2)处理
  sax2.0定义的核心处理接口一共有
  org.xml.sax.contenthandler
  org.xml.sax.errorhandler
  org.xml.sax.dtdhandler
  org.xml.sax.entityresolver
  这些接口是通过
  org.xml.sax.xmlreader的setcontenthandler(),seteroorhandler(),
  setdtdhandler(),setentityhandler()注册到解析器,这里面最重要的是
  org.xml.sax.contenthandler接口,它具体如下
  public interface contenthandler{
  public void setdocumentlocator(locator locator);
  public void startdocument() throws saxexception;
  public void enddocument() throws saxexception;
  public void startprefixmapping(string prefix,string uri)
  throws saxexception;
  public void endprefixmapping(string prifix)
  throws saxexception;
  public void startelement(string namespaceuri,string localname,
  string qname,attributes atts) throws saxexception;
  public void endelement(string namespaceuri,string localname,
  string qname) throws saxexception;
  public void characters(char ch[],int start,int length)
  throws saxexception;
  public void ignorablewhitespace(char ch[],int start,int length)
  throws saxexception;
  public void processinginstruction(string target,string data)
  throws saxexception;
  public void skippedentity(string name)
  throws saxexception;
  }
  通过setcontenthandler()将你实现的contenthandler注册给xmlreader之后,
  在解析过程中,系统根据各种条件执行接口中的方法,下面简单说明一下
  1)文档定位器
  private locator locator;
  
  public void setdocumentlocator(locator locator){
  this.locator = locator;
  }
  
  通常情况下,你只要如此实现就可以了,这个主要是得到当前解析的位置,
  通过得到的locator,你可以使用它的getlinenumber(),getcolumnname()等
  方法,可以得到文档当前的位置,但要注意的是,这个locator不能保存,只
  针对当前的解析有效
  2)文档的开头和结尾
  public void startdocument() throws saxexception{
  //解析过程中仅位于setdocumentlocator()方法后调用
  }
  public void enddocument() throws saxexception{
  //解析过程中最后调用
  }
  
  大多数情况下你可以不用理他们,只要写个空方法就可以了
  3)名字空间的开始和结束
  public void startprefixmapping(string prefix,string uri)
  throws saxexception{
  }
  public void endprefixmapping(string prifix)
  throws saxexception{
  }
  4)元素的开始和结束
  public void startelement(string namespaceuri,string localname,
  string qname,attributes atts) throws saxexception{
  }
  public void endelement(string namespaceuri,string localname,
  string qname) throws saxexception{
  }
  5)元素的数据
  public void characters(char ch[],int start,int length)
  throws saxexception{
  string s = new string(ch,start,length);
  }
  这个是得到当前的元素的文本数据
  6)可以忽略的空白
  public void ignorablewhitespace(char ch[],int start,int length)
  throws saxexception{
  }
  7)实体
  public void skippedentity(string name)
  throws saxexception{
  }
  8)指令处理
  public void processinginstruction(string target,string data)
  throws saxexception{
  }
  3)例子:这个是从java & xml 中复制过来的,
  /*
  * created on 2004-11-30
  *
  * todo to change the template for this generated file go to
  * window - preferences - java - code style - code templates
  */
  package javaxml2;
  
  /**
  * @author yuangfang
  *
  * todo to change the template for this generated type comment go to
  * window - preferences - java - code style - code templates
  */
  
  import java.io.*;
  import java.util.*;
  import org.xml.sax.*;
  import org.xml.sax.ext.lexicalhandler;
  import org.xml.sax.helpers.xmlreaderfactory;
  
  import java.awt.*;
  import javax.swing.*;
  import javax.swing.tree.*;
  
  public class saxtreeviewer extends jframe{
  
  private string vendorparserclass = "org.apache.xerces.parsers.saxparser";
  
  private jtree jtree;
  defaulttreemodel defaulttreemodel;
  
  public saxtreeviewer(){
  super("sax tree viewer");
  setsize(600,450);
  }
  
  public void init(string xmluri) throws ioexception,saxexception{
  defaultmutabletreenode base = new defaultmutabletreenode("xml document:" + xmluri);
  defaulttreemodel = new defaulttreemodel(base);
  jtree = new jtree(defaulttreemodel);
  
  buildtree(defaulttreemodel,base,xmluri);
  getcontentpane().add(new jscrollpane(jtree),borderlayout.center);
  
  }
  
  public void buildtree(defaulttreemodel treemodel,defaultmutabletreenode base,string xmluri)
  throws ioexception,saxexception{
  
  string featureuri = "";
  try{
  xmlreader reader = xmlreaderfactory.createxmlreader(vendorparserclass);
  
  contenthandler jtreecontenthandler = new jtreecontenthandler(treemodel,base);
  errorhandler jtreeerrorhandler = new jtreeerrorhandler();
  
  reader.setcontenthandler(jtreecontenthandler);
  reader.seterrorhandler(jtreeerrorhandler);
  reader.setentityresolver(new simpleentityresolver());
  
  featureuri = "http://xml.org/sax/features/validation";
  reader.setfeature(featureuri,true);
  
  featureuri = "http://xml.org/sax/features/namespaces";
  setnamespaceprocessing(reader,true);
  
  featureuri = "http://xml.org/sax/features/string-interning";
  reader.setfeature(featureuri,true);
  
  featureuri = "http://apache.org/xml/features/validation/schema";
  reader.setfeature(featureuri,false);
  
  inputsource inputsource = new inputsource(xmluri);
  reader.parse(inputsource);
  }
  catch(saxnotrecognizedexception e){
  system.out.println("the parse class " + vendorparserclass
  + " does not recognize the feature uri " + featureuri);
  system.exit(0);
  }
  catch(saxnotsupportedexception e){
  system.out.println("the parser class " + vendorparserclass +
  " does not support the feature uri " + featureuri);
  }
  }
  
  private void setnamespaceprocessing(xmlreader reader,boolean state)
  throws saxnotsupportedexception,saxnotrecognizedexception
  {
  reader.setfeature("http://xml.org/sax/features/namespaces",state);
  reader.setfeature("http://xml.org/sax/features/namespace-prefixes",!state);
  }
  public static void main(string[] args) {
  try{
  if(args.length != 1){
  system.out.println("usage:java javaxml2.saxtreeviewer " + "[xml document uri]");
  system.exit(0);
  }
  saxtreeviewer viewer = new saxtreeviewer();
  viewer.init(args[0]);
  viewer.setvisible(true);
  }catch(exception e)
  {
  e.printstacktrace();
  }
  }
  }
  
  class jtreecontenthandler implements contenthandler,lexicalhandler{
  private defaulttreemodel treemodel;
  
  private defaultmutabletreenode current;
  
  private locator locator;
  
  private map namespacemapp

扫描关注微信公众号