- 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);
几种解析的优劣势.....
最新推荐文章于 2024-01-24 16:47:38 发布