使用SAX解析XML文档

步骤1.一个简单的XML文档:
   XML代码:
<?xml version="1.0" encoding="GBK"?>  
<StudentInfo>  
    
<student>  
        
<name>赵海波</name>  
        
<sex></sex>  
        
<lesson>  
            
<lessonName>Spring整合开发</lessonName>  
            
<lessonScore>85</lessonScore>  
        
</lesson>  
        
<lesson>  
            
<lessonName>轻量级J2EE应用开发</lessonName>  
            
<lessonScore>95</lessonScore>  
        
</lesson>  
        
<lesson>  
            
<lessonName>Ajax应用开发</lessonName>  
            
<lessonScore>80</lessonScore>  
        
</lesson>  
    
</student>  
    
<student>  
        
<name>程卫娜</name>  
        
<sex></sex>  
        
<lesson>  
            
<lessonName>Spring整合开发</lessonName>  
            
<lessonScore>80</lessonScore>  
        
</lesson>  
        
<lesson>  
            
<lessonName>轻量级J2EE应用开发</lessonName>  
            
<lessonScore>85</lessonScore>  
        
</lesson>  
        
<lesson>  
            
<lessonName>Ajax应用开发</lessonName>  
            
<lessonScore>90</lessonScore>  
        
</lesson>  
    
</student>  
</StudentInfo>  

步骤2.用于处理XML文档的事件监听器:
   Java代码:

import org.xml.sax.*;   
public class XMLContentHandler implements ContentHandler   
{      
    
//DTD中定义的元素名   
    private static final String ELEMENT_NAME = "name";   
    
private static final String ELEMENT_SEX = "sex";   
    
private static final String ELEMENT_LESSON = "lesson";   
    
private static final String ELEMENT_LESSON_NAME = "lessonName";   
    
private static final String ELEMENT_LESSON_SCORE = "lessonScore";   
    
private static final String ELEMENT_STUDENT = "student";   
    
private static final String ELEMENT_LINE = "breakLine";    
    
//当前元素的数据   
    private String currentData = "";   
    
private String lessonName = "";   
    
private String lessonScore = "";   
    
//当其他某一个调用事件发生时,先调用此方法来在文档中定位。   
    public void setDocumentLocator(Locator locator)   
    
{   
    }
   
    
//在解析整个文档开始时调用   
    public void startDocument() throws SAXException   
    
{   
        System.out.println(
"XML文件开始解析");   
    }
   
    
//在解析整个文档结束时调用   
    public void endDocument() throws SAXException   
    
{   
        System.out.println(
"XML文件解析结束");   
    }
   
    
// 在解析命名空间开始时调用   
    public void startPrefixMapping(String prefix, String uri) throws SAXException   
    
{   
        System.out.println(
"XML解析器开始解析命名空间");   
    }
   
    
//在解析命名空间结束时调用   
    public void endPrefixMapping(String prefix) throws SAXException   
    
{   
        System.out.println(
"XML解析器解析命名空间结束");   
    }
   
    
//在解析元素开始时调用   
    public void startElement(String namespaceURI, String localName,String qName, Attributes atts) throws SAXException   
    
{   
        System.out.println(
"XML解析器开始解析元素" + localName);   
    }
   
    
//在解析元素结束时调用   
    public void endElement(String namespaceURI, String localName, String qName) throws SAXException   
    
{   
        
if (localName.equals(ELEMENT_NAME))   
        
{   
            System.out.println(localName 
+ "    :    " + currentData);   
        }
   
        
if (localName.equals(ELEMENT_SEX))   
        
{   
            System.out.println(localName 
+ "     :     " + currentData);   
        }
   
        
if (localName.equals(ELEMENT_LESSON_NAME))   
        
{   
            
this.lessonName = currentData;   
        }
   
        
if (localName.equals(ELEMENT_LESSON_SCORE))   
        
{   
            
this.lessonScore = currentData;   
        }
   
        
if (localName.equals(ELEMENT_LESSON))   
        
{   
            System.out.println(lessonName 
+ "      :     " + lessonScore);   
        }
   
        System.out.println(
"XML解析器解析元素" + localName + "结束");   
    }
   
    
// 取得元素数据   
    public void characters(char[] ch, int start, int length) throws SAXException   
    
{   
        currentData 
= new String(ch, start, length).trim();   
        System.out.println(
"XML解析器成功解析到元素数据");   
    }
   
    
//取得元素数据中的空白   
    public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException   
    
{   
    }
   
    
//在解析到处理指令时,调用此方法。   
    public void processingInstruction(String target, String data) throws SAXException   
    
{   
    }
   
    
//当未验证解析器忽略实体时调用此方法   
    public void skippedEntity(String name) throws SAXException   
    
{   
    }
   
}
  

步骤3.通过主程序开始解析XML文档,解析XML文档的代码如下:
   java代码:
import java.io.*;   
import org.xml.sax.*;   
import org.xml.sax.helpers.*;   
public class SAXParser   
{   
    
public static void main(String[] args)   
    
{   
        SAXParser sax 
= new SAXParser();   
        sax.parseXMLFile(
"student.xml");   
    }
   
    
// 解析文档   
    private void parseXMLFile(String fileName)   
    
{          
        
try  
        
{   
            
//通过指定解析器的名称来动态加载解析器   
            XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");   
            
//处理内容前要注册内容管理器   
            parser.setContentHandler(new XMLContentHandler());   
            
//开始解析文档   
            parser.parse(fileName);   
        }
   
        
catch (IOException e)   
        
{   
            e.printStackTrace();   
        }
   
        
catch (SAXException e)   
        
{   
            e.printStackTrace();   
        }
   
    }
   
}
  

posted on 2008-09-28 11:09 nonels 阅读(1733) 评论(5)  编辑  收藏 所属分类: J2EE

评论

# re: 使用SAX解析XML文档[未登录] 2009-05-22 14:44 tiger

您写的很清楚,谢谢啊,中国需要这样的人才,支持您,我也是研究xml应用的研究生,不过自己刚开始学习,看过您的文档后收获很多。我的邮箱是tjnuwanghu◎163.com 最近在做个导师给的任务,要将一个xml文档解析成类似注册表那样的列表,用的解析器是xerces-c++,自己在虚拟机linux上安装了此解析器,但还是不会用它写程序来简单解析xml文档,您有时间了给我看看,举个例子,先谢谢您哦。

徒弟  回复  更多评论   

# re: 使用SAX解析XML文档 2009-08-07 08:51 路过

楼上的 如果你真的是研究生的话 那中国完了 我是一高中生 上面的例子也没什么难的   回复  更多评论   

# re: 使用SAX解析XML文档 2009-08-12 14:42 心灵探索者

闻道有先后,授业有专攻  回复  更多评论   

# re: 使用SAX解析XML文档 2009-08-17 22:24 Fucher

高中生很适合干这个。  回复  更多评论   

# re: 使用SAX解析XML文档 2009-12-02 23:27 hello

研究生? 雷死...  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2008年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿(2)

随笔分类(16)

随笔档案(16)

搜索

最新评论

阅读排行榜

评论排行榜