使用SAX把XML转换成JTree

SAX指的是Sample  Application For XML。他的工作过程可以用这样一个例子来说明。有这样一列数有正数有负数,要统计其中正数和 负数的数量,我们用的方法就是从头开始一个一个的和零比较,然后再计算相应的数量。这个方法就是和SAX方法比较类似。SAX处理XML的方法也是这样,从头开始读取文件看我们获得的对所获得的元素进行处理。下面介绍SAXjava中的应用。

 

 

要想在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的简单例子,参考了《JavaXML》一书。

 

 

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="www@www.sina.com">

 

 

<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文件的修改该等功能。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java使用SAX解析XML,你可以按照以下步骤进行操作: 1. 导入相关的类和包,如`javax.xml.parsers.SAXParser`和`javax.xml.parsers.SAXParserFactory`。 2. 创建`SAXParserFactory`的实例。 3. 通过调用`SAXParserFactory`的`newSAXParser()`方法创建一个解析器。 4. 获取需要解析的XML文档,并创建一个`File`对象来表示该文档。 5. 创建一个自定义的`SAXHandler`类,该类继承自`DefaultHandler`类,并重写需要的回调方法来处理XML元素和数据。 6. 调用解析器的`parse()`方法,传入文件和自定义的`SAXHandler`对象作为参数,开始解析XML文档。 你可以参考以下示例代码: ```java import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; public class TestDemo { public static void main(String[] args) throws Exception { // 1.实例化SAXParserFactory对象 SAXParserFactory factory = SAXParserFactory.newInstance(); // 2.创建解析器 SAXParser parser = factory.newSAXParser(); // 3.获取需要解析的文档,生成解析器,最后解析文档 File f = new File("books.xml"); SaxHandler dh = new SaxHandler(); parser.parse(f, dh); } } ``` 请注意,上述代码的`SaxHandler`是一个自定义的类,你需要根据自己的需求来实现该类,以便在解析XML时处理相应的元素和数据。 XML文档如下所示: ```xml <?xml version="1.0" encoding="UTF-8"?> <books> <book id="001"> <title>Harry Potter</title> <author>J K. Rowling</author> </book> <book id="002"> <title>Learning XML</title> <author>Erik T. Ray</author> </book> </books> ``` 希望以上信息能够帮到你。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [java使用sax解析xml的解决方法](https://download.csdn.net/download/weixin_38747216/12815749)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [在java使用sax解析xml](https://blog.csdn.net/weixin_33884611/article/details/86303531)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值