XML中的SAX接口与DOM接口

    技术2022-05-11  61

        DOM解析器通过对XML文档的分析,把整个XML文档以一棵DOM树的形式存放在内存中,应用程序可以随时对DOM树中的任何一个部分进行访问与操作,也就是说,通过DOM树,应用程序可以对XML文档进行随机访问。这种访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容。         然而,由于DOM解析器把整个XML文档转化成DOM树放在了内存中,因此,当XML文档比较大或者文档结构比较复杂时,对内存的需求就比较高。而且,对于结构复杂的树的遍历也是一项比较耗时的操作。所以,DOM解析器对机器性能的要求比较高,实现效率不十分理想。不过,由于DOM解析器的树结构的思想与XML文档的结构相吻合,而且,通过DOM树机制很容易实现随机访问。     SAX解析器在对XML文档进行分析时,触发一系列的事件,应用程序通过事件处理函数实现对XML文档的访问。由于事件触发本身是有时序性的,因此,SAX解析器提供的是一种对XML文档的顺序访问机制,对于已经分析过的部分,不能再倒回去重新处理。SAX之所以被叫做"简单"应用程序接口,是因为SAX解析器只做了一些简单的工作,大部分工作还要由应用程序自己去做。也就是说,SAX解析器在实现时,它只是顺序地检查XML文档中的字节流,判断当前字节是XML语法中的哪一部分,检查是否符合XML语法并触发相应的事件。         对于事件处理函数本身,要由应用程序自己来实现。同DOM分析器相比,SAX解析器对XML文档的处理缺乏一定的灵活性,然而,对于那些只需要访问XML文档中的数据而不对文档进行更改的应用程序来说,SAX解析器的效率则更高。由于SAX解析器实现简单,对内存要求比较低,因此实现效率比较高。     那么我们能不能把二者的优点结合起来,让SAX解析器获取相应的数据,用DOM解析器根据新的需要形成一个XML文件,下面通过一个案例,说明二者是怎样结合使用,首先创建一个XML文件,用来获取数据,打开记事本,在里面输入下列代码: 例8-14 <?xml version="1.0" encoding="GB2312" ?> <学生成绩表>   <学生>     <学生姓名>王培</学生姓名>     <学生成绩>56</学生成绩>   </学生>    <学生>     <学生姓名>程雪方</学生姓名>     <学生成绩>60</学生成绩>   </学生>    <学生>     <学生姓名>周昌举</学生姓名>     <学生成绩>34</学生成绩>   </学生>    <学生>     <学生姓名>王尚</学生姓名>     <学生成绩>78</学生成绩>   </学生> </学生成绩表>       将该文件保存,文件名为Sax_14.xml。打开记事本在里面输入下列java代码: 例8-14 import javax.xml.parsers.*; import org.xml.sax.helpers.*; import org.xml.sax.*; import java.io.*; import javax.xml.transform.*; import javax.xml.transform.stream.*; import javax.xml.transform.dom.*; import org.w3c.dom.*; public class Sax_14{      public static void main(String args[]){            try{               SAXParserFactory factory1=SAXParserFactory.newInstance();               SAXParser saxParser=factory1.newSAXParser();               MyHandler handler=new MyHandler();               saxParser.parse(new File("Sax_14.xml"),handler);               DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();               DocumentBuilder builder=factory.newDocumentBuilder();               Document document=builder.newDocument();               document.setXmlVersion("1.0");               Element 学生姓名表=document.createElement("学生姓名表");               document.appendChild(学生姓名表);               for(int k=1;k<=handler.str1.length;k++){                      学生姓名表.appendChild(document.createElement("学生"));                  }                NodeList nodeList=document.getElementsByTagName("学生");               int size=nodeList.getLength();               for(int k=0;k<size;k++){               Node node=nodeList.item(k);               if(node.getNodeType()==Node.ELEMENT_NODE)                         {                           Element elementNode=(Element)node;                           elementNode.appendChild(document.createElement("学生姓名"));                         }                       }               nodeList=document.getElementsByTagName("学生姓名");              size=nodeList.getLength();              for(int k=0;k<size;k++){              Node node=nodeList.item(k);              if(node.getNodeType()==Node.ELEMENT_NODE){                          Element elementNode=(Element)node;                          elementNode.appendChild(document.createTextNode(handler.str1[k]));                       }                   }            TransformerFactory transFactory=TransformerFactory.newInstance();             Transformer transformer=transFactory.newTransformer();             DOMSource domSource=new DOMSource(document);             File file=new File("学生姓名表.xml");             FileOutputStream out=new FileOutputStream(file);             StreamResult xmlResult=new StreamResult(out);             transformer.transform(domSource,xmlResult);              }           catch(Exception e){               System.out.println(e);              }       } } class MyHandler extends DefaultHandler{          String str1[]=new String[4];           boolean letter=false;           int i=0;          public void startElement(String uri,String localName,String qName,Attributes atts) {            if(qName.equals("学生姓名"))               letter=true;           }          public void characters(char[] ch,int start,int length){             String text=new String(ch,start,length);             if(letter){                  str1[i]=text.trim();                  i++;                  letter=false;                   }         }   }     将该文件保存,文件名为Sax_14.java。编译后解释执行,会自动产生一个“学生姓名表.XML”文件,该文件的源代码为: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <学生姓名表>     <学生>          <学生姓名>王培</学生姓名>     </学生>     <学生>          <学生姓名>程雪方</学生姓名>     </学生>     <学生>          <学生姓名>周昌举</学生姓名>     </学生>     <学生>          <学生姓名>王尚</学生姓名>     </学生> </学生姓名表>     对于java例子中的代码这里就不再解释了,这些都是前面用过的语句。

    最新回复(0)