java解析xml文件

XML的解析方式有五种,分别为:

DOM(Document Object Model),

DTD(Document Type Definition),

SAX(Simple API for XML),

XSD(Xml Schema Definition),

XSLT(Extensible Stylesheet Language Transformations)

其中最常用的解析方法为DOM和SAX,DOM是基于XML文档树结构的解析,SAX是基于事件流的解析。

 

DOM方式解析:

 

 

 

SAX方式解析:

SAX是Simple API for XML的缩写,它并不是由W3C官方所提出的标准。SAX是一种轻量型的方法,不像DOM解析时,把XML文档全部载入内存中,在PC上操作,Dom还有优势,但在手机中端上则无优势,因为手机内存和硬件都比不上PC强。使用 SAX 是比较安全的,并且 Android 提供了一种传统的 SAX 使用方法,以及一个便捷的 SAX 包装器。SAX采用基于事件驱动的处理方式,它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理。

 

下面是一个SAX解析XML的示例(有点长,因为详细注解了SAX事件处理的所有方法),SAX API中主要有四种处理事件的接口,它们分别是ContentHandlerDTDHandlerEntityResolverErrorHandler。下面的例子可能有点冗长,实际上只要继承DefaultHandler类 ,再覆盖一部分 处理事件的方法 同样可以达到这个示例的效果,但为了纵观全局,还是看看SAX API里面所有主要的事件解析方法吧。( 实际上DefaultHandler就是实现了上面的四个事件处理器接口,然后提供了每个抽象方法的默认实现。)

 

如果定制,则还需要重写这几个方法。

1、开始解析

 

public void startDocument() 

2、结束解析

 

 

public void endDocument() 

3、遇到元素1

 

 

public void startElement(String namespaceURI, String localName,     
            String qName, Attributes atts)  

4、遇到元素2

 

 

public void endElement(String namespaceURI, String localName, String qName) 

5、元素1于元素2之间

 

 

public void characters(char ch[], int start, int length) 

实例:

 

1、首先,创建xml文件。

java解析xml文件

2、解析前,先创建与XML属性对应的Bean实体类,该类中的属性和XML属性一一对应,也可以再对属性创建get和set方法。

 

public class Student {
        private int id;
        private int group;
        private String name;
        private String sex;
        private int age;
        private String email;
        private String memo;
        private String birthday;
        ....
//省略set、get方法
}

3、开始解析

 

 

public class SaxParseXml extends DefaultHandler{

    //存放遍历集合
    private List<Student> list;
    //构建Student对象
    private Student student;
    //定义一个标记变量,标记当前xml被解析到哪个标签。
    private String tagName;
    ....//get、set方法

    //只调用一次  初始化list集合  
    @Override
    public void startDocument() throws SAXException {
        list=new ArrayList<Student>();
    }
    
    
    //调用多次    开始解析
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        if(qName.equals("student")){
            student=new Student();
            //获取student节点上的id属性值
            student.setId(Integer.parseInt(attributes.getValue(0)));
            //获取student节点上的group属性值
            student.setGroup(Integer.parseInt(attributes.getValue(1)));
        }
        this.tagName=qName;
    }
    
    
    //调用多次  
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if(qName.equals("student")){
            this.list.add(this.student);
        }
        this.tagName=null;
    }
    
    
    //只调用一次
    @Override
    public void endDocument() throws SAXException {
    }
    
    //调用多次
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if(this.tagName!=null){
            String date=new String(ch,start,length);
            if(this.tagName.equals("name")){
                this.student.setName(date);
            }
            else if(this.tagName.equals("sex")){
                this.student.setSex(date);
            }
            else if(this.tagName.equals("age")){
                this.student.setAge(Integer.parseInt(date));
            }
            else if(this.tagName.equals("email")){
                this.student.setEmail(date);
            }
            else if(this.tagName.equals("birthday")){
                this.student.setBirthday(date);
            }
            else if(this.tagName.equals("memo")){
                this.student.setMemo(date);
            }
        }
    }
    
    
    
    public static void main(String[] args) {
        SAXParser parser = null;
        try {
            //构建SAXParser
            parser = SAXParserFactory.newInstance().newSAXParser();
            //实例化  DefaultHandler对象
            SaxParseXml parseXml=new SaxParseXml();
            //加载资源文件 转化为一个输入流
            InputStream stream=SaxParseXml.class.getClassLoader().getResourceAsStream("Student.xml");
            //调用parse()方法
            parser.parse(stream, parseXml);
            //遍历结果
            List<Student> list=parseXml.getList();
            for(Student student:list){
                System.out.println("id:"+student.getId()+"\tgroup:"+student.getGroup()+"\tname:"+student.getName()+"\tsex:"+student.getSex()+"\tage:"+student.getAge()+"\temail:"+student.getEmail()+"\tbirthday:"+student.getBirthday()+"\tmemo:"+student.getMemo());
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
}

4、打印出结果:

 

 

你可能感兴趣的:(解析xml)