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文件的修改该等功能。
本文地址:http://com.8s8s.com/it/it15481.htm