DOM,SAX,JDOM,DOM4J优缺点比较及生产xml和解析xml

下载必要的jar包:

activation.jar
commons-logging-1.0.4.jar
dom4j-1.6.1.jar
jaxen-1.1.1.jar
jdom-1.0.jar

一、DOM

解析器读入整个文档,然后构建一个驻留内存的树结构,使用 DOM 接口来操作这个树结构。

优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;访问效率高。

缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)

 
  1. package xmlParse;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.util.Calendar;  
  8. import java.util.Locale;  
  9. import java.util.TimeZone;  
  10.   
  11. import javax.xml.parsers.DocumentBuilder;  
  12. import javax.xml.parsers.DocumentBuilderFactory;  
  13. import javax.xml.parsers.ParserConfigurationException;  
  14. import javax.xml.parsers.SAXParser;  
  15. import javax.xml.parsers.SAXParserFactory;  
  16. import javax.xml.transform.Result;  
  17. import javax.xml.transform.Transformer;  
  18. import javax.xml.transform.TransformerConfigurationException;  
  19. import javax.xml.transform.TransformerException;  
  20. import javax.xml.transform.TransformerFactory;  
  21. import javax.xml.transform.dom.DOMSource;  
  22. import javax.xml.transform.stream.StreamResult;  
  23.   
  24. import org.w3c.dom.DOMException;  
  25. import org.w3c.dom.Document;  
  26. import org.w3c.dom.Element;  
  27. import org.w3c.dom.Node;  
  28. import org.w3c.dom.NodeList;  
  29. import org.xml.sax.SAXException;  
  30.   
  31. /** 
  32.  * java自带的dom解析xml文件 
  33.  *  
  34.  * @author abc 
  35.  *  
  36.  */  
  37. public class TestDom {  
  38.     public static void main(String[] args) {  
  39.         builXmlByDom();  
  40.         parseXmlByDom();  
  41.     }  
  42.     /** 
  43.      * 生成xml信息 
  44.      */  
  45.     public static void builXmlByDom() {  
  46.         long begintime = System.currentTimeMillis();  
  47.         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
  48.         try {  
  49.             //构建Document  
  50.             DocumentBuilder db = dbf.newDocumentBuilder();  
  51.             Document doc=db.newDocument();  
  52.             Element root=doc.createElement("students");  
  53.             root.setAttribute("class", "一班");  
  54.             root.setAttribute("count", "3");  
  55.               
  56.             Element stu=doc.createElement("student");  
  57.             Element name=doc.createElement("name");  
  58.             name.appendChild(doc.createTextNode("小明"));  
  59.             Element age=doc.createElement("age");  
  60.             age.appendChild(doc.createTextNode("10"));  
  61.             stu.appendChild(name);  
  62.             stu.appendChild(age);  
  63.             root.appendChild(stu);  
  64.               
  65.               
  66.              stu=doc.createElement("student");  
  67.              stu.setAttribute("position","班长");  
  68.              name=doc.createElement("name");  
  69.              name.appendChild(doc.createTextNode("小王"));  
  70.              age=doc.createElement("age");  
  71.              age.appendChild(doc.createTextNode("11"));  
  72.              stu.appendChild(name);  
  73.              stu.appendChild(age);  
  74.              root.appendChild(stu);  
  75.   
  76.              stu=doc.createElement("student");  
  77.              name=doc.createElement("name");  
  78.              name.appendChild(doc.createTextNode("小兵"));  
  79.              age=doc.createElement("age");  
  80.              age.appendChild(doc.createTextNode("12"));  
  81.              stu.appendChild(name);  
  82.              stu.appendChild(age);  
  83.              root.appendChild(stu);  
  84.                
  85.              doc.appendChild(root);  
  86.              //将被变换的Document对象封装到一个DOMSource对象中  
  87.              DOMSource xmlSource=new DOMSource(doc);  
  88.              //使用 Transformer对象将一个Document节点变换为一个XML文件  
  89.              TransformerFactory transFactory=TransformerFactory. newInstance();  
  90.              Transformer transformer=transFactory.newTransformer();  
  91.                
  92.              //创建Result  
  93.              File file=new File("students.xml");  
  94.              FileOutputStream fos;  
  95.              fos = new FileOutputStream(file);  
  96.              StreamResult result=new StreamResult(fos);  
  97.              transformer.transform(xmlSource, result);  
  98.              if(fos!=null){  
  99.                  fos.close();  
  100.              }  
  101.         }catch (ParserConfigurationException e) {  
  102.             e.printStackTrace();  
  103.         }catch (TransformerConfigurationException e) {  
  104.             e.printStackTrace();  
  105.         }catch (FileNotFoundException e) {  
  106.             e.printStackTrace();  
  107.         }catch (TransformerException e) {  
  108.             e.printStackTrace();  
  109.         }catch (IOException e) {  
  110.             e.printStackTrace();  
  111.         }    
  112.         System.out.println("dom生成时间(毫秒)"  
  113.                 + (System.currentTimeMillis() - begintime));  
  114.     }  
  115.     /** 
  116.      * 解析xml信息 
  117.      */  
  118.     public static void parseXmlByDom() {  
  119.         long begintime = System.currentTimeMillis();;  
  120.         try {  
  121.             DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();  
  122.             DocumentBuilder builder=dbf.newDocumentBuilder();  
  123.             File file=new File("students.xml");  
  124.             Document doc=builder.parse(file);  
  125.             NodeList students=doc.getFirstChild().getChildNodes();  
  126.             Node student=null;  
  127.             Node node=null;  
  128.             for(int i=0,len=students.getLength();i<len;i++){  
  129.                 student=students.item(i);  
  130.                 NodeList childs=student.getChildNodes();  
  131.                 System.out.println("第"+(i+1)+"个学生");  
  132.                 for(int j=0,size=childs.getLength();j<size;j++){  
  133.                     node=childs.item(j);  
  134.                     if("name".equals(node.getNodeName())){  
  135.                         System.out.println(node.getNodeName()+"---"+node.getTextContent());  
  136.                     }  
  137.                     if("age".equals(node.getNodeName())){  
  138.                         System.out.println(node.getNodeName()+"---"+node.getTextContent());  
  139.                     }  
  140.                 }  
  141.             }  
  142.         } catch (DOMException e) {  
  143.             e.printStackTrace();  
  144.         } catch (ParserConfigurationException e) {  
  145.             e.printStackTrace();  
  146.         } catch (SAXException e) {  
  147.             e.printStackTrace();  
  148.         } catch (IOException e) {  
  149.             e.printStackTrace();  
  150.         }  
  151.         System.out.println("dom解析时间(毫秒)"  
  152.                 + (System.currentTimeMillis() - begintime));  
  153.     }  
  154. }  


二、SAX

特点:  1、边读边解析,应用于大型XML文档

              2、只支持读

              3、访问效率低

              4、顺序访问

[java] view plain copy
  1. package xmlParse;  
  2.   
  3. import java.io.File;  
  4.   
  5. import javax.xml.parsers.SAXParser;  
  6. import javax.xml.parsers.SAXParserFactory;  
  7.   
  8. public class TestSAXParse {  
  9.   
  10.     /** 
  11.      * @param args 
  12.      */  
  13.     public static void main(String[] args) {  
  14.         sax();  
  15.     }  
  16.   
  17.     public static void sax() {  
  18.         long begintime = System.currentTimeMillis();  
  19.         File f = new File("students.xml");  
  20.         SAXParserFactory sf = SAXParserFactory.newInstance();  
  21.         try {  
  22.             SAXParser sp = sf.newSAXParser();  
  23.             SAXHandler handler = new SAXHandler();  
  24.             sp.parse(f, handler);  
  25.         } catch (Exception e) {  
  26.             e.printStackTrace();  
  27.         }  
  28.         System.out.println("sax解析时间(毫秒)"  
  29.                 + (System.currentTimeMillis() - begintime));  
  30.   
  31.     }  
  32. }  
  33.   
  34.   
  35.   
  36. SAXHandler.java  
  37. package xmlParse;  
  38.   
  39. import org.xml.sax.Attributes;  
  40. import org.xml.sax.SAXException;  
  41. import org.xml.sax.helpers.DefaultHandler;  
  42. import java.util.Stack;  
  43. public class SAXHandler extends DefaultHandler {  
  44.     Stack tags = null;  
  45.     @Override  
  46.     public void startDocument() throws SAXException {  
  47.         tags=new Stack();  
  48.     }  
  49.   
  50.     @Override  
  51.     public void endDocument() throws SAXException {  
  52.         while(!tags.isEmpty()){  
  53.             System.out.println(tags.peek());  
  54.             tags.pop();  
  55.         }  
  56.         tags=null;  
  57.     }  
  58.   
  59.     @Override  
  60.     public void startElement(String uri, String localName, String qName,  
  61.             Attributes attributes) throws SAXException {  
  62.         if("students".equals(qName)){  
  63.             System.out.println(attributes.getValue("class")+"--人数-"+attributes.getValue("count"));  
  64.         }  
  65.         tags.push(qName);//压入栈  
  66.     }  
  67.   
  68.     @Override  
  69.     public void endElement(String uri, String localName, String qName)  
  70.             throws SAXException {  
  71.         tags.pop();//取出栈顶元素  
  72.     }  
  73.   
  74.     @Override  
  75.     public void characters(char[] ch, int start, int length)  
  76.             throws SAXException {  
  77.         String tag=(String) tags.peek();//查看栈顶元素,但不移除  
  78.         if("name".equals(tag)){  
  79.             System.out.println("name==="+new String(ch,start,length));  
  80.         }  
  81.         if("age".equals(tag)){  
  82.             System.out.println("age==="+new String(ch,start,length));  
  83.         }  
  84.     }  
  85.   
  86. }  


三、JDOM

JDOM
优点:①是基于树的处理XML的Java API,把树加载在内存中
     ②没有向下兼容的限制,因此比DOM简单
     ③速度快,缺陷少
     ④具有SAX的Java规则
缺点:①不能处理大于内存的文档
     ②JDOM表示XML文档逻辑模型。不能保证每个字节真正变换。
     ③针对实例文档不提供DTD与模式的任何实际模型。
     ④不支持与DOM中相应遍历包
最适合于:JDOM具有树的便利,也有SAX的JAVA规则。在需要平衡时使用


[java] view plain copy
  1. JDOM  
  2.   
  3.   
  4. package xmlParse;  
  5.   
  6. import java.io.ByteArrayOutputStream;  
  7. import java.io.File;  
  8. import java.io.FileInputStream;  
  9. import java.io.FileNotFoundException;  
  10. import java.io.FileOutputStream;  
  11. import java.io.IOException;  
  12. import java.util.List;  
  13.   
  14. import org.jdom.Document;  
  15. import org.jdom.Element;  
  16. import org.jdom.JDOMException;  
  17. import org.jdom.input.SAXBuilder;  
  18. import org.jdom.output.XMLOutputter;  
  19.   
  20. public class TestJDOM {  
  21.   
  22.     /** 
  23.      * @param args 
  24.      */  
  25.     public static void main(String[] args) {  
  26.         buildXmlByJDOM();  
  27.         parseXmlByJDOM();  
  28.     }  
  29.       
  30.     public static String buildXmlByJDOM(){  
  31.         Document doc=new Document();  
  32.         Element root=new Element("students");  
  33.         root.setAttribute("count", "3");  
  34.         root.setAttribute("class", "一班");  
  35.         doc.setRootElement(root);  
  36.         root.addContent(new Element("student").addContent(new Element("name").setText("小明"))  
  37.                 .addContent(new Element("age").setText("10")));  
  38.         root.addContent(new Element("student").addContent(new Element("name").setText("小汪"))  
  39.                 .addContent(new Element("age").setText("11")));  
  40.         root.addContent(new Element("student").addContent(new Element("name").setText("小兵"))  
  41.                 .addContent(new Element("age").setText("12")));  
  42.         ByteArrayOutputStream out=new ByteArrayOutputStream();  
  43.         XMLOutputter putter=new XMLOutputter();  
  44.         try {  
  45.             putter.output(doc, out);  
  46.             putter.output(doc, new FileOutputStream("students.xml"));  
  47.         } catch (FileNotFoundException e) {  
  48.             e.printStackTrace();  
  49.         } catch (IOException e) {  
  50.             e.printStackTrace();  
  51.         }  
  52.         return out.toString();  
  53.     }  
  54.    public static void parseXmlByJDOM(){  
  55.        long begintime=System.currentTimeMillis();  
  56.        File f=new File("students.xml");    
  57.        SAXBuilder builder=new SAXBuilder();  
  58.        try {  
  59.         Document doc=builder.build(new FileInputStream(f));  
  60.         Element root=doc.getRootElement();  
  61.         System.out.println(root.getAttributeValue("class")+"-人数:--"+root.getAttributeValue("count"));  
  62.           
  63.         List list=root.getChildren("student");  
  64.         for(int i=0;i<list.size();i++){  
  65.             Element ele=(Element)list.get(i);  
  66.             System.out.println("第"+(i+1)+"个学生");  
  67.             System.out.println(ele.getChildText("name")+"---"+ele.getChildText("age"));  
  68.         }  
  69.         } catch (FileNotFoundException e) {  
  70.             e.printStackTrace();  
  71.         } catch (JDOMException e) {  
  72.             e.printStackTrace();  
  73.         } catch (IOException e) {  
  74.             e.printStackTrace();  
  75.         }  
  76.         System.out.println("sax解析时间(毫秒)"+(System.currentTimeMillis()-begintime));  
  77.    }  
  78. }  


四、DOM4J

DOM4J 是一个非常非常优秀的java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。 

 

    DOM4J  
    package xmlParse;  
      
    import java.io.File;  
    import java.io.FileInputStream;  
    import java.io.FileNotFoundException;  
    import java.io.FileWriter;  
    import java.io.IOException;  
    import java.io.UnsupportedEncodingException;  
    import java.util.Iterator;  
    import java.util.List;  
      
    import org.dom4j.Document;  
    import org.dom4j.DocumentException;  
    import org.dom4j.DocumentHelper;  
    import org.dom4j.Element;  
    import org.dom4j.Node;  
    import org.dom4j.io.OutputFormat;  
    import org.dom4j.io.SAXReader;  
    import org.dom4j.io.XMLWriter;  
      
    public class TestDom4J {  
      
        /** 
         * @param args 
         */  
        public static void main(String[] args) {  
            buildXmlByDOM4J();  
            paserXmlByDOM4J();  
        }  
        public static void buildXmlByDOM4J(){  
            Document doc=DocumentHelper.createDocument();  
            doc.setXMLEncoding("UTF-8");  
            Element root=doc.addElement("students");  
            root.addAttribute("class", "一班").addAttribute("count", "3");  
            Element student=root.addElement("student");  
            student.addElement("name").setText("小明");  
            student.addElement("age").setText("10");  
              
            student=root.addElement("student").addAttribute("position", "班长");  
            student.addElement("name").setText("小汪");  
            student.addElement("age").setText("11");  
          
            student=root.addElement("student");  
            student.addElement("name").setText("小兵");  
            student.addElement("age").setText("12");  
              
            String xmlStr=doc.asXML();  
            try {  
                OutputFormat format=OutputFormat.createPrettyPrint();  
                XMLWriter writer=new XMLWriter(new FileWriter(new File("students.xml")),format);  
                writer.setEscapeText(false);  
                writer.write(xmlStr);  
                writer.close();  
            } catch (UnsupportedEncodingException e) {  
                e.printStackTrace();  
            } catch (FileNotFoundException e) {  
                e.printStackTrace();  
            }catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
        public static void paserXmlByDOM4J(){  
              long begintime=System.currentTimeMillis();  
              SAXReader reader=new SAXReader();  
              try {  
                Document doc=reader.read(new FileInputStream(new File("students.xml")));  
                Element root=doc.getRootElement();  
                System.out.println(root.attributeValue("class")+"--人数--"+root.attributeValue("count"));  
        /*      List<Node> list=root.selectNodes("student");//需要引入jaxen-1.1.1.jar 
                for(int i=0,len=list.size();i<len;i++){ 
                    Node node=(Node)list.get(i); 
                    System.out.println(node.selectSingleNode("name").getText()+"---"+node.selectSingleNode("age").getStringValue()); 
                }*/  
                Iterator it=root.elementIterator();  
                Element ele;  
                while(it.hasNext()){  
                    ele=(Element)it.next();  
                    //System.out.println(ele.selectSingleNode("name").getText()+"---"+ele.selectSingleNode("age").getText());  
                    System.out.println(ele.elementText("name")+"---"+ele.elementText("age"));  
                }  
              } catch (FileNotFoundException e) {  
                e.printStackTrace();  
            } catch (DocumentException e) {  
                e.printStackTrace();  
            }  
                
              System.out.println("sax解析时间(毫秒)"+(System.currentTimeMillis()-begintime));  
        }  
    }  

 dom4解析xml的另一个代码案例:

    package com.java.team;  
      
    import java.io.File;  
    import java.util.ArrayList;  
    import java.util.Iterator;  
    import java.util.List;  
      
    import org.dom4j.Document;  
    import org.dom4j.DocumentException;  
    import org.dom4j.Element;  
    import org.dom4j.io.SAXReader;  
      
    public class ParseXml {  
        public void read() throws Exception {  
            SAXReader reader = new SAXReader();  
            Document document = reader.read(new File("src/test.xml"));  
            Element root = document.getRootElement();  
            //将解析出来的allresource下的resourceitem放在list中  
            List list  = root.elements("resourceitem");  
            //创建source存放每一个resourceitem中资源  
            List<XmlBean> source = new ArrayList<XmlBean>();  
            //将resourceitem中的各项解析出来,通过XmlBean存放到source中  
            for(Iterator i = list.iterator();i.hasNext();) {  
                Element resourceitem = (Element) i.next();  
                String id = resourceitem.element("id").getText();  
                String title = resourceitem.element("title").getText();  
                String keywords = resourceitem.element("keywords").getText();  
                String kind = resourceitem.element("kind").getText();  
                String describe = resourceitem.element("describe").getText();  
                String date = resourceitem.element("date").getText();  
                String url = resourceitem.element("url").getText();  
                String author = resourceitem.element("author").getText();  
                String publisher = resourceitem.element("publisher").getText();  
                XmlBean bean = new XmlBean();  
                bean.setId(id);  
                bean.setTitle(title);  
                bean.setKeywords(keywords);  
                bean.setKind(kind);  
                bean.setDescribe(describe);  
                bean.setDate(date);  
                bean.setUrl(url);  
                bean.setAuthor(author);  
                bean.setPublisher(publisher);  
                source.add(bean);  
            }  
         
        }  
      
    }  


 
XmlBean类如下:
[java] view plain copy

    package com.java.team;  
      
    public class XmlBean {  
        private String id;  
        private String title;  
        private String keywords;  
        private String kind;  
        private String describe;  
        private String date;  
        private String url;  
        private String author;  
        public String getKeywords() {  
            return keywords;  
        }  
      
        public void setKeywords(String keywords) {  
            this.keywords = keywords;  
        }  
      
        public String getKind() {  
            return kind;  
        }  
      
        public void setKind(String kind) {  
            this.kind = kind;  
        }  
      
        public String getDescribe() {  
            return describe;  
        }  
      
        public void setDescribe(String describe) {  
            this.describe = describe;  
        }  
      
        public String getDate() {  
            return date;  
        }  
      
        public void setDate(String date) {  
            this.date = date;  
        }  
      
        public String getUrl() {  
            return url;  
        }  
      
        public void setUrl(String url) {  
            this.url = url;  
        }  
      
        public String getAuthor() {  
            return author;  
        }  
      
        public void setAuthor(String author) {  
            this.author = author;  
        }  
      
        public String getPublisher() {  
            return publisher;  
        }  
      
        public void setPublisher(String publisher) {  
            this.publisher = publisher;  
        }  
      
        private String publisher;  
      
        public String getId() {  
            return id;  
        }  
      
        public void setId(String id) {  
            this.id = id;  
        }  
      
        public String getTitle() {  
            return title;  
        }  
      
        public void setTitle(String title) {  
            this.title = title;  
        }  
      
    }  

xml文件部分如下:
[html] view plain copy

    <?xml version="1.0" encoding="UTF-8"?>  
      
    <allresource host="192.168.16.111" remote="192.168.16.111">   
      <resourcenum>499</resourcenum>    
      <resourceitem>   
        <id>2</id>    
        <title>《实数》复习d.doc</title>    
        <keywords>实数复习,期中复习</keywords>    
        <kind>doc</kind>    
        <describe>期中复习训练题</describe>    
        <date>2008-6-18 20:50:01</date>    
        <url>http://192.168.16.111:8080/resources/《实数》复习d.doc</url>    
        <author>胡克林</author>    
        <publisher>历城二中</publisher>   
      </resourceitem>    
      <resourceitem>   
        <id>3</id>    
        <title>《轴对称图形》教学设计</title>    
        <keywords>轴对称图形,平面几何图形</keywords>    
        <kind>doc</kind>    
        <describe>认识轴对称图形,知道轴对称图形的含义,能够找出轴对称图形的对称轴</describe>    
        <date>2008-6-18 20:55:10</date>    
        <url>http://192.168.16.111:8080/resources/《轴对称图形》教学设计.doc</url>    
        <author>胡克林</author>    
        <publisher>历城二中</publisher>   
      </resourceitem>    

 

转载于:https://www.cnblogs.com/sxc1991/p/7419375.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值