Java加载和解析XML文件的两种方法

对于Java来说,加载和解析XML文件有两种方法:

一种:通过加载整个XML文件生成Document文档,然后解析Document文档内容的树和根。

另一种:利用SAX封装类来逐步解析。

这两种方法各有优点和缺点:第一种由于需要加载整个XML文件生成Document,在解析,所以假如XML文件内容过多、过大,就会造成加载延迟,缓慢(所以此方法只适用于XML文件比较小点 的XML文件);而第二种方法利用SAX封装类来加载XML文件,实现边加载边解析,不用等到全部的XML内容加载完成,所以无需担心XML文件过大、内容过多等问题,但由于消耗的系统资源比第一种要多。所以说各有利弊。总的一句话说,XML文件小的话,就使用第一种方法,假如文件过大,就是用第二种。

在开始前先来看看整个项目的结构


其中,Gamers.xml就是我们要解析的xml文件,再来看一下xml内的内容

<?xml version="1.0" encoding="UTF-8"?>  
<Gamers>  
    <Gamer>  
        <ID>TOR_Apple</ID>  
        <Grade>13</Grade>  
    </Gamer>  
    <Gamer>  
        <ID>TOR_zhuang</ID>  
        <Grade>16</Grade>  
    </Gamer>  
    <Gamer>  
        <ID>TOR_KongBai</ID>  
        <Grade>13</Grade>  
    </Gamer>  
    <Gamer>  
        <ID>TOR_OMG</ID>  
        <Grade>16</Grade>  
    </Gamer>  
</Gamers> 

xml文件结构:树<Gamer>,根<Gamer>和每个根内的元素<ID>、<Grade>(我是个魔兽迷~~)。

好了,先来看看第一种方法:生成Document方式解析XML文件

    package com.parsers;  
      
    import java.io.File;  
    import java.io.IOException;  
    import javax.xml.parsers.DocumentBuilder;  
    import javax.xml.parsers.DocumentBuilderFactory;  
    import javax.xml.parsers.ParserConfigurationException;  
    import org.w3c.dom.Document;  
    import org.w3c.dom.NodeList;  
    import org.xml.sax.SAXException;  
      
    public class XmlParsers {  
        //采用DOM解析形式  
        /** 
         * @param args 
         */  
        public static void main(String[] args) {  
            // TODO Auto-generated method stub  
            //导入xml文件,要注意xml文件的路径要正确  
            File file=new File("xmlfields/Gamers.xml");  
            /*实例化一个DocumentBuildFactory,一个document构造器构建的工厂, 
            顾名思义,我想大家都能猜到它的作用了吧。*/  
            DocumentBuilderFactory dbf=  
                    DocumentBuilderFactory.newInstance();  
            DocumentBuilder db;  
            try {  
                //实例化一个DocumentBuilder,一个document构造器,用于生成Document文档  
                db=dbf.newDocumentBuilder();  
                //通过构造器的parse()方法,将一个File对象生成相应的Document文档  
                Document document=db.parse(file);  
                /*根据字符串在document内查找相应的根,其返回值是一个节点链表, 
                至于链表不懂的话,大家可以去看一下数据结构*/  
                NodeList nodeList=document.getElementsByTagName("Gamer");  
                for(int j=0;j<nodeList.getLength();j++){  
                    //返回相应根内的子节点,其返回值也是个节点链表  
                    NodeList childList=nodeList.item(j).getChildNodes();  
                    for(int i=0;i<childList.getLength();i++){  
                        //获取相应的根内的元素的名字  
                        String tagName=childList.item(i).getNodeName();  
                        if(tagName.equals("ID")){  
                            /* 
                             * 这里要注意一下,假如我想获取ID标签下的值(假如是TOR_Apple),很多人都这样写 
                             * childList.item(i).getNodeValue(),但这样是错了,不会等到相应的结果,由于childList.item(i) 
                             * 这句代码的得到的只是<ID>,而TOR_Apple这个值不是<ID>的值,而是<ID>的子节点。切记*/  
                            System.out.print(childList.item(i).getChildNodes().item(0).getNodeValue()+"==");  
                        }else if(tagName.equals("Grade")){  
                            System.out.println(childList.item(i).getChildNodes().item(0).getNodeValue());  
                        }  
                    }  
                }  
            } catch (ParserConfigurationException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            } catch (SAXException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            } catch (IOException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
        }  
      
    }  

好了,代码中有注释,相信大家一定会看的很明白的。第一种解析XML文件的方法就介绍到这。接下来,就是第二种解析XML文件的方法咯,废话不多说,上代码

    package com.parsers;  
      
    import java.io.IOException;  
      
    import javax.xml.parsers.ParserConfigurationException;  
    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;  
      
    public class XmlParsersUserSAX extends DefaultHandler{  
      
        /** 
         * @param args 
         */  
        String tagName=null;  
        public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {  
            // TODO Auto-generated method stub  
            XmlParsersUserSAX spus=new XmlParsersUserSAX();  
            //实例化一个SAX解析工厂  
            SAXParserFactory spf=SAXParserFactory.newInstance();  
            //通过工厂生成一个SAX解析器SAXParser  
            SAXParser saxParser=spf.newSAXParser();  
            //解析xml文件  
            saxParser.parse(new InputSource("xmlfields/Gamers.xml"), spus);  
        }  
      
        @Override  
        public void startDocument() throws SAXException {  
            // TODO Auto-generated method stub  
            //系统自动调用,当开始解析xml文件时(遇到树节点),就会被自动调用  
            System.out.println("准备开始解析对象....");  
        }  
      
        @Override  
        public void endDocument() throws SAXException {  
            // TODO Auto-generated method stub  
            //系统自动调用,当结束解析xml文件时(遇到树结束节点),就会被自动调用  
            System.out.println("对象解析结束....");  
        }  
      
        @Override  
        public void startElement(String uri, String localName, String qName,  
                Attributes attributes) throws SAXException {  
            // TODO Auto-generated method stub  
            //系统自动调用  
            if(qName.equals("ID") || qName.equals("Grade")){  
                System.out.println("开始解析元素...");  
                tagName=qName.trim();  
                System.out.println(tagName);  
            }  
        }  
      
        @Override  
        public void endElement(String uri, String localName, String qName)  
                throws SAXException {  
            // TODO Auto-generated method stub  
            //系统自动调用  
            System.out.println("元素解析完毕...");  
            tagName=null;  
        }  
      
        @Override  
        public void characters(char[] ch, int start, int length)  
                throws SAXException {  
            // TODO Auto-generated method stub  
            //系统自动调用  
            if(tagName!=null){  
                if(tagName.equals("ID")){  
                    System.out.print(tagName+":"+new String(ch,start,length)+"==");  
                }else if(tagName.equals("Grade")){  
                    System.out.println(tagName+":"+new String(ch,start,length));  
                }  
            }  
        }  
    }  

好了,两种方法都讲完了~~呵呵呵呵,不知道对大家有木有用处,望哪位学友、大神飘过了留下宝贵的意见,thanks!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值