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

xml解析(sax java)

2013年12月14日 ⁄ 综合 ⁄ 共 5093字 ⁄ 字号 评论关闭

     sax解析xml类似与流媒体,它不需要把整个文件读入内存,然后才解析,而是读入一部分就开始解析。在解析程序中用了一个栈存放了xml的每个节点,解析的时候直接取出该节点,然后取得对应的值。这个程序复写了DefaultHandler类的public void characters(char ch[], int start, int length)和startElement(String uri, String localName, String qName,Attributes attrs)方法。由于sax解析的特点,把每个student放入到容器的时候,老出现问题。

 

程序允许结果:

班级:30713
学号:3071300
姓名:小明
性别:男
年龄:10
班级:30713
学号:3071301
姓名:小花
性别:女
年龄:20
班级:30713
学号:3071302
姓名:不知道
性别:男
年龄:15
班级:30714
学号:3071400
姓名:小明
性别:男
年龄:10
班级:30714
学号:3071401
姓名:小花
性别:女
年龄:20
班级:30714
学号:3071402
姓名:不知道
性别:男
年龄:15
运行时间:47 毫秒

 

 

数据模型:

//Student.java

package com.xie.xmlparse.dom4j.modal;

public class Student {
       private Long classId;
       private Long stuId;
       private String stuName;
       private String stuSex;
       private int stuAge;
 public Long getClassId() {
  return classId;
 }
 public void setClassId(Long classId) {
  this.classId = classId;
 }
 public Long getStuId() {
  return stuId;
 }
 public void setStuId(Long stuId) {
  this.stuId = stuId;
 }
 public String getStuName() {
  return stuName;
 }
 public void setStuName(String stuName) {
  this.stuName = stuName;
 }
 public String getStuSex() {
  return stuSex;
 }
 public void setStuSex(String stuSex) {
  this.stuSex = stuSex;
 }
 public int getStuAge() {
  return stuAge;
 }
 public void setStuAge(int stuAge) {
  this.stuAge = stuAge;
 }
      
      
}

配置文件:

//student.xml

<?xml version="1.0" encoding="UTF-8"?>
<school>
     <class name="030713">
        <student>
           <stuid>03071300</stuid>
           <stuname>小明</stuname>
           <stusex>男</stusex>
           <stuage>10</stuage>
        </student>
        <student>
           <stuid>03071301</stuid>
           <stuname>小花</stuname>
           <stusex>女</stusex>
           <stuage>20</stuage>
        </student>
        <student>
           <stuid>03071302</stuid>
           <stuname>不知道</stuname>
           <stusex>男</stusex>
           <stuage>15</stuage>
        </student>       
     </class>
     <class name="030714">
        <student>
           <stuid>03071400</stuid>
           <stuname>小明</stuname>
           <stusex>男</stusex>
           <stuage>10</stuage>
        </student>
        <student>
           <stuid>03071401</stuid>
           <stuname>小花</stuname>
           <stusex>女</stusex>
           <stuage>20</stuage>
        </student>
        <student>
           <stuid>03071402</stuid>
           <stuname>不知道</stuname>
           <stusex>男</stusex>
           <stuage>15</stuage>
        </student>       
     </class>    
</school>

 

解析程序:

//ParseXml.java

 

package com.xie.xmlparse.sax;

import java.util.ArrayList;
import java.util.Stack;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.xie.xmlparse.dom4j.modal.Student;

//将xml中的数据读出
public class ParseXml extends DefaultHandler{
 Stack<String> tags=new Stack<String>();
 String classname="";
 ArrayList<Student> asList=new ArrayList<Student>();
  Student s=null;
 ParseXml(){
  super();
 }
    public static void main(String args[]) {

        long lasting = System.currentTimeMillis();

        try {

               SAXParserFactory sf = SAXParserFactory.newInstance();

               SAXParser sp = sf.newSAXParser();

               ParseXml reader = new ParseXml();
              
               sp.parse(new InputSource("D://project//XmlParse//xmlFiles//student.xml"), reader);
              
              ArrayList<Student> asList=reader.asList;
               for(int i=0;i<asList.size();i++){
                Student s=asList.get(i);
                System.out.println("班级:"+s.getClassId());
                System.out.println("学号:"+s.getStuId());
                System.out.println("姓名:"+s.getStuName());
                System.out.println("性别:"+s.getStuSex());
                System.out.println("年龄:"+s.getStuAge());
               }

        } catch (Exception e) {

               e.printStackTrace();

        }
       
        System.out.println("运行时间:"+(System.currentTimeMillis() - lasting)+" 毫秒");

 }

 

 public void characters(char ch[], int start, int length)throws SAXException {
    
 
        while(!tags.empty()){
                
           String tag = (String) tags.pop();
          
           if (tag.equals("class")) {
            classname=new String(ch,start-9,length-3);
            //System.out.println("班级:" +classname);
     }
                
           if (tag.equals("stuid")) {
            s=new Student();
            s.setStuId(Long.parseLong(new String(ch,start,length)));
               //System.out.println("学号:" +new String(ch,start,length));
               //System.out.println("班级:" +classname);
              s.setClassId(Long.parseLong(classname));
           }else if (tag.equals("stuname")) {
            s.setStuName(new String(ch, start, length));
            //System.out.println("姓名:" +new String(ch, start, length));
     }else if (tag.equals("stusex")) {
            s.setStuSex(new String(ch, start, length));
            //System.out.println("性别:" +new String(ch, start, length));
     }else if (tag.equals("stuage")) {
                 s.setStuAge(Integer.parseInt(new String(ch, start, length)));
                  //System.out.println("年龄:" +new String(ch, start, length));
                 asList.add(s);
           }
         
           
         
        }
       
        
       

 }

 public void startElement(String uri, String localName, String qName,Attributes attrs) {

        tags.push(qName);

 }

}

抱歉!评论已关闭.