(转)使用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   
ExpandedBlockStart.gifContractedBlock.gif
{      
    
//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)   
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{   
    }
   
    
//在解析整个文档开始时调用   
    public void startDocument() throws SAXException   
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{   
        System.out.println(
"XML文件开始解析");   
    }
   
    
//在解析整个文档结束时调用   
    public void endDocument() throws SAXException   
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{   
        System.out.println(
"XML文件解析结束");   
    }
   
    
// 在解析命名空间开始时调用   
    public void startPrefixMapping(String prefix, String uri) throws SAXException   
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{   
        System.out.println(
"XML解析器开始解析命名空间");   
    }
   
    
//在解析命名空间结束时调用   
    public void endPrefixMapping(String prefix) throws SAXException   
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{   
        System.out.println(
"XML解析器解析命名空间结束");   
    }
   
    
//在解析元素开始时调用   
    public void startElement(String namespaceURI, String localName,String qName, Attributes atts) throws SAXException   
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{   
        System.out.println(
"XML解析器开始解析元素" + localName);   
    }
   
    
//在解析元素结束时调用   
    public void endElement(String namespaceURI, String localName, String qName) throws SAXException   
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{   
        
if (localName.equals(ELEMENT_NAME))   
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{   
            System.out.println(localName 
+ "    :    " + currentData);   
        }
   
        
if (localName.equals(ELEMENT_SEX))   
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{   
            System.out.println(localName 
+ "     :     " + currentData);   
        }
   
        
if (localName.equals(ELEMENT_LESSON_NAME))   
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{   
            
this.lessonName = currentData;   
        }
   
        
if (localName.equals(ELEMENT_LESSON_SCORE))   
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{   
            
this.lessonScore = currentData;   
        }
   
        
if (localName.equals(ELEMENT_LESSON))   
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{   
            System.out.println(lessonName 
+ "      :     " + lessonScore);   
        }
   
        System.out.println(
"XML解析器解析元素" + localName + "结束");   
    }
   
    
// 取得元素数据   
    public void characters(char[] ch, int start, int length) throws SAXException   
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{   
        currentData 
= new String(ch, start, length).trim();   
        System.out.println(
"XML解析器成功解析到元素数据");   
    }
   
    
//取得元素数据中的空白   
    public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException   
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{   
    }
   
    
//在解析到处理指令时,调用此方法。   
    public void processingInstruction(String target, String data) throws SAXException   
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{   
    }
   
    
//当未验证解析器忽略实体时调用此方法   
    public void skippedEntity(String name) throws SAXException   
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{   
    }
   
}
  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值