现在的位置: 首页 > 综合 > 正文

(转)使用SAX解析XML文档

2011年10月23日 ⁄ 综合 ⁄ 共 5020字 ⁄ 字号 评论关闭
步骤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();   
        }
   
    }
   
}
  

抱歉!评论已关闭.