分享
 
 
 

使用SAX把XML转换成JTree

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有