几种解析的优劣势.....

  • 1.DOM解析xml
  • ================================================
  • DOM树所提供的随机访问方式给应用程序的开发带来了很大的灵活性,
  • 可以任意地控制整个XML文档中的内容。然而,由于DOM分析器把整个XML文
  •         档转化成DOM树放在了内存中,因此,当文档比较大或者结构比较复杂时,
  • 对内存的需求就比较高。而且,对于结构复杂的树的遍历也是一项耗时的操
  • 作。所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想。不
  • 过,由于DOM分析器所采用的树结构的思想与XML文档的结构相吻合,同时鉴
  • 于随机访问所带来的方便,因此,DOM分析器还是有很广泛的使用价值的。
  • Node对象:DOM 结 构 中 最 为 基  本 的 对 象
  • Document对象:代表整个XML的文档
  • NodeList对象:包含一个或者多个Node的列表
  • Element对象:代表XML文档中的标签元素
  • 2.pull解析
  • =============================================
  • PULL解析是一种比较节省内存的解析方式,它允许应用程序代码从解析器中获取事件,例如,文档开始、文档结束、标签开始、标签结束。PULL解析器的运行方式与 SAX 解析器相似。PULL解析和SAX解析不一样的地方是PULL读取XML文件后触发相应的事件调用方法返回的是数字,另外,PULL可以在程序中被控制,想解析到哪里停止就可解析到哪里停止。

  • 3.SAX解析xml
  • ====================================================
  •   与DOM比较而言,SAX是一种轻量型的方法。我们知道,在处理DOM
  • 的时候,我们需要读入整个的XML文档,然后在内存中创建DOM树,生成DOM树上
  • 的每个Node对象。当文档比较小的时候,这不会造成什么问题,但是一旦文档大起
  • 来,处理DOM就会变得相当费时费力。特别是其对于内存的需求,也将是成倍的增
  • 长,以至于在某些应用中使用DOM是一件很不划算的事(比如在applet中)。这时候
  • ,一个较好的替代解决方法就是SAX。
  •      SAX在概念上与DOM完全不同。它不同于DOM的文档驱动,它是事件驱动的,
  • 它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。所谓事件驱
  • 动,是指一种基于回调(callback)机制的程序运行方法。
  • DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结
  • 构,然后代码就可以根据DOM接口来操作这个树结构了。




  • 4.DOM和SAX优劣势
  • ====================================================
  •   优点:整个文档读入内存,方便操作:支持修改、删除和重现排列等多种功能。

  •   缺点:将整个文档读入内存中,保留了过多的不需要的节点,浪费内存和空间。

  •   使用场合:一旦读入文档,还需要多次对文档进行操作,并且在硬件资源充足

  • 的情况下(内存,CPU)。

  • 为了解决DOM解析存在的问题,就出现了SAX解析。其特点为:


  •   优点:不用实现调入整个文档,占用资源少。尤其在嵌入式环境中,如android

  • ,极力推荐使用SAX解析。

  •   缺点:不像DOM解析一样将文档长期驻留在内存中,数据不是持久的。如果事

  • 件过后没有保存数据,数据就会丢失。

  •   使用场合:机器有性能限制


  • 5.JDOM解析 
  • =================================================
  •          JDOM的目的是成为java特定文档模型,它简化与xml的交互并且不使用DOM实
  • 现更快,JDOM仅使用具体类而不是接口。这在某些方面简化API,但是也限制了灵
  • 活性。第二,API大量使用了colletions类,简化。




  • 5.DOM4J解析
  • =================================================
  •           DOM4J使用接口和抽象基本方法。DOM4J大量使用了API中的Collections类,
  • 但是在许多情况下,它提供了一些替代方法允许更好的性能或更直接的编码方法。
  • 直接好处是,虽然DOM4J付出了更多复杂的API的代价,但它提供了比JDOM大得多
  • 的灵活性。

  • 6.初始步骤如下:
  • =================================================
  • 1.创建解析工厂:
  • DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
  • 2.指定DocumentBuilder
  • DocumentBuilder db = factory.newDocumentBuilder();
  • 3.从文件构造一个Document,因为XML文件中已经指定了编码,所以这里不必了
  • Document xmlDoc = db.parse(new File("book.xml")); 
  • 上面三步可以得到映射了指定的XML文件的Document,之后,通过这个Document可以
  • 来操作XML。
  • 得到Document的根
  • Element root = xmlDoc.getDocumentElement() 
  • 得到根后通过getTagName可以得到根节点名及其他一系列操作。
  • 获得XML某个元素的值:
  • NodeList list = root.getElementsByTagName_r("page");
  • //NodeList对象存储的是指定元素的值的列表,
  • //我们可以通过遍历来得到指定元素的各个值:
  • for(int i=0;i<list.getLength();i++){
  • Element element = (Element)list.item(i); //得到"page"的第i+1组标签
  • String id = element.getAttribute("id");  //获得ID属性
  • //
  • //得到标签title的列表
  • NodeList titleList = element.getElementsByTagName_r("title");
  • //得到"title"的第1组标签,事实上也只有一组标签
  • Element titleElement = (Element)titleList.item(0);
  • //获得title元素的第一个值
  • String title = titleElement.getFirstChild().getNodeValue();
  • }
  •  
  • 二.修改
  • Element theBook=null, theElem=null;
  • //   创建指定类型的元素
  •    theBook = xmlDoc.createElement_x("book");
  •    theElem = xmlDoc.createElement_x("name");
  • //   元素theElem设置数值,并作为theBook的子节点   
  •    theElem.setTextContent("新书");
  •    theBook.a(theElem);
  • //     作为root的子节点
  •    root.a(theBook);
  •  
  • 三.输出
  • 通过DOMSource和StreamResult完成
  • //首先创建转化工厂
  • TransformerFactory transFactory=TransformerFactory.newInstance();
  • //创建Transformer,它能够将源树转换为结果树
  • Transformer transformer = transFactory.newTransformer();
  • //接下来设置输出属性
  • transformer.setOutputProperty("indent", "yes");
  • DOMSource source =new DOMSource();
  • source.setNode(xmlDoc);
  • StreamResult result = new StreamResult();
  • 接下来有三种输出用途:
  • //1.将XML字符串输出到String字符串中
  • ByteArrayOutputStream baos = new ByteArrayOutputStream();
  • result.setOutputStream(baos);
  • 在执行完transformer.transform(source, result)后,
  • 加入String s = baos.toString();
  • //2.直接输出到控制台上
  • result.setOutputStream(System.out);
  • //3.保存到指定的文件里面
  • result.setOutputStream(new FileOutputStream("book.xml"));
  • //开始执行将XML Source转换为 Result
  • transformer.transform(source, result); 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值