使用SAX把XML转换成JTree

类别:Java 点击:0 评论:0 推荐:

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