SAX指的是Sample  Application For XML。他的工作过程可以用这样一个例子来说明。有这样一列数有正数有负数,要统计其中正数和负数的数量,我们用的方法就是从头开始一个一个的和零比较,然后再计算相应的数量。这个方法就是和SAX方法比较类似。SAX处理XML的方法也是这样,从头开始读取文件看我们获得的对所获得的元素进行处理。下面介绍SAX在java中的应用。 
要想在Java中使用SAX处理XML,首先要拥有一个XML解析类,还要拥有一个SAX类以及相应的XML文档。XML解析类可以使用Apache Xerces 或者Xalan等,在下面的例子中使用的是Xerces(用google就能搜索到)。对于XML的处理可以分为两个部分,首先是通过XMLReader把对xml文件开始读取,然后可以通过注册相应的处理类完成对xml文件的处理。注册的类主要包括:内容处理类(ContentHandler)、错误处理类(ErrorHandler)、实体处理类(EntityResolver)、DTD处理类(DTDHandler)。通过这些类的注册可以完成相应的处理。使用相应的Set方法可以完成对xmlReader完成对应的类的注册。这里主要介绍一下内容类的使用方法。 
内容处理类(ContentHandler)对中,包括了对XML中内容中各种能够元素的处理方法,每个元素都对应于一个start方法和一个end方法,通过对这两个方法的实现完成相应的操作。可以这样认为,对于XML的处理完全是通过他的处理类来完成的。下面给出一个通过XML文件生成Jtree的简单例子,参考了《Java与XML》一书。 
package TestSax; 
import javax.swing.*; 
import java.awt.*; 
import org.xml.sax.*; 
import java.io.IOException; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeModel; 
  
public class SaxTree extends JFrame { 
  private org.xml.sax.XMLReader reader ; 
  private JTree tree; 
  public SaxTree() { 
    init(); 
    this.setSize(800,600); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.show(); 
  } 
  public void init() 
  { 
    try { 
      DefaultMutableTreeNode root = new DefaultMutableTreeNode("root"); 
      DefaultTreeModel model = new DefaultTreeModel(root); 
      tree = new JTree(model); 
      InputSource in = new InputSource("first1.xml"); 
      reader = org.xml.sax.helpers.XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); 
      reader.setContentHandler(new Content(root)); 
      reader.parse(in); 
      model.reload(root); 
      this.getContentPane().add(new JScrollPane(tree),BorderLayout.CENTER); 
    } 
    catch (SAXException ex) { 
      ex.printStackTrace(System.out); 
    } 
    catch(IOException ex){ 
      ex.printStackTrace(System.out); 
    } 
  
  } 
  public static void main(String[] args) { 
    SaxTree tree = new SaxTree(); 
  } 
} 
class Content implements ContentHandler 
{ 
  DefaultMutableTreeNode node; 
  DefaultMutableTreeNode current; 
  public Content(DefaultMutableTreeNode node) 
  { 
    this.node = node; 
    this.current = node; 
  } 
  
  public void endDocument() { 
   current = (DefaultMutableTreeNode) current.getParent(); 
  } 
  
  public void startDocument() { 
   DefaultMutableTreeNode doc = new DefaultMutableTreeNode("Document"); 
   current.add(doc); 
   current = doc; 
  } 
  
  public void characters(char[] ch, int start, int length) { 
    String data = String.copyValueOf(ch,start,length); 
    if(data != null && data.trim().length() != 0 ) 
    { 
      DefaultMutableTreeNode temp = new DefaultMutableTreeNode(data); 
      current.add(temp); 
//      System.out.println("Data is :" + data); 
    } 
  } 
  
  public void ignorableWhitespace(char[] ch, int start, int length) { 
  } 
  
  public void endPrefixMapping(String prefix) { 
    this.current = (DefaultMutableTreeNode) current.getParent(); 
  } 
  
  public void skippedEntity(String name) { 
  } 
  
  public void setDocumentLocator(Locator locator) { 
  } 
  
  public void processingInstruction(String target, String data) { 
  
  } 
  
  public void startPrefixMapping(String prefix, String uri) { 
    DefaultMutableTreeNode pref = new DefaultMutableTreeNode(prefix +":"+uri); 
    this.current.add(pref); 
    this.current = pref; 
    System.out.println(prefix+":"+uri); 
  } 
  
  public void endElement(String namespaceURI, String localName, String qName) { 
    current = (DefaultMutableTreeNode) current.getParent(); 
  } 
  
  public void startElement(String namespaceURI, String localName, String qName, 
                           Attributes atts) { 
   int length = atts.getLength(); 
   String attributes = ""; 
   DefaultMutableTreeNode temp; 
   for(int i = 0 ; i < length ; i++) 
   { 
     attributes = attributes + atts.getQName(i) +":"+atts.getValue(i)+"  "; 
   } 
   if(attributes.length()>0) 
   { 
      temp = new DefaultMutableTreeNode("Element:  " + 
         qName + "  Attibutes: " + attributes); 
   } 
   else 
   { 
     temp = new DefaultMutableTreeNode("Element:  " +qName); 
   } 
   current.add(temp); 
   current = temp; 
  } 
  
} 
例子中用到的XML文件如下: 
first1.xml 
<?xml version="1.0" encoding="UTF-8"?> 
<school> 
<student id = "000001" email="[email protected]"> 
<name>Tom</name> 
<sex>male</sex> 
<age>19</age> 
<birthDate>1981-05-09</birthDate> 
</student> 
<student id = "000002"> 
<name>Lucy</name> 
<sex>female</sex> 
<age>18</age> 
<birthDate>1982-03-06</birthDate> 
</student> 
<student id = "000003"> 
<name>Robert</name> 
<sex>male</sex> 
<age>20</age> 
<birthDate>1980-06-08</birthDate> 
</student> 
<student id = "000004"> 
<name>Lily</name> 
<sex>famale</sex> 
<age>18</age> 
<birthDate>1982-03-06</birthDate> 
</student> 
</school> 
通过上面的例子我们看到,SAX处理XML文件就像处理数组一样,从头开始顺序处理,对于这种处理方式,不适合对其进行进行修改。在下一章介绍的DOM可以克服这个缺点完成对XML文件的修改该等功能。  
 
  |