1 SAX

  • 在使用DOM解析XML文档的时候,需要读取整个XML文档,在内存中构架代表整个DOM树的Document对象,从而再对XML文档进行操作。此种情况下,如果XML文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。
  • SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才对文档进行操作。
  • SAX采用事件处理的方式解析XML文件,利用SAX解析XML文档,涉及两个部分:解析器和事件处理器:

    • 解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。
    • 解析器采用SAX方式在解析某个XML文档的时候,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方式时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。
    • 事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松的得到SAX解析器解析到的数据,从而可以决定如何对数据进行处理。
  • 示例:通过SAX解析xml文档,并将数据封装到javabean中
<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架>
<书>
    <书名>java从入门到放弃</书名>
    <作者>呵呵</作者>
    <售价>0.01</售价>
</书>
<书>
    <书名>c从入门到精通</书名>
    <作者>我好</作者>
    <售价>1.00</售价>
</书>
</书架>
package com;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 2017/10/28
 * 说明:
 */
public class SAXDemo {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        List<Book> books = new ArrayList<>();

        //使用SAXParserFactory创建SAX解析工厂
        SAXParserFactory spf = SAXParserFactory.newInstance();
        //通过SAX解析工厂得到解析对象
        SAXParser sp= spf.newSAXParser();
        //通过解析器对象得到一个XML的读取器
        XMLReader xmlReader = sp.getXMLReader();
        //设置读取器的事件处理器
        xmlReader.setContentHandler(new DefaultHandler(){
            private Book book = null;
            private String currentTagName;//当前读取的元素的名称

            public void startElement (String uri, String localName, String qName, Attributes attributes) throws SAXException {
                if("书".equals(qName)){
                    book = new Book();

                }
                currentTagName = qName;
            }
            public void endElement (String uri, String localName, String qName) throws SAXException {
                if("书".equals(qName)){
                    books.add(book);//读到书标记的结束,把书对象存起来
                }
                currentTagName = null;
            }
            public void characters (char ch[], int start, int length) throws SAXException {
                if("书名".equals(currentTagName)){
                    book.setName(new String(ch,start,length));
                }
                if("作者".equals(currentTagName)){
                    book.setAuthor(new String(ch,start,length));
                }
                if("售价".equals(currentTagName)){
                    book.setPrice(new String(ch,start,length));
                }
            }

        });
        //解析xml文件
        xmlReader.parse("D:\\code\\web\\src\\main\\webapp\\book.xml");
        for(Book b:books){
            System.out.println(b);
        }

    }
}

2 DOM4j

  • dom4j是一个简单、灵活的开发源代码的库。dom4j是由早起开发jdom的人分离出来而后独立开发的。与jdom不同的是,dom4j使用接口和抽象类,虽然dom4j的API相对复杂一些,但它提供了比jdom更好的灵活性。
  • dom4j是一个非常优秀的java XML API,并且性能优异、功能强大和极其使用的特点。

2.1 Document对象

  • 在dom4j中,获取Document对象的方式有三种:
  • ①读取xml文件,获取Document对象
SAXReader reader = new SAXReader();
Document document = reader.read(new File("book.xml"));
  • ②解析XML形式的文本,得到Document对象
String text = "<member></member>";
Document document = DocumentHelper.parseText(text);
  • ③主动创建Document对象
Document document = DocumentHelper.createDocument();
Element root = document.addElement("member");

2.2 节点对象

  • 获取文档的根节点
Element root = document.getRootElement();
  • 获取某个节点的子节点
Element element=node.element(“书名");
  • 获取节点的文本
String text=node.getText();
  • 取得某个节点下的所有名为"member"的子接单,并进行遍历
List nodes = rootElm.elements("member");
for (Iterator it = nodes.iterator(); it.hasNext();) {
   Element elm = (Element) it.next();
    // do something
}
  • 对某节点下的所有子节点遍历
for(Iterator it=root.elementIterator();it.hasNext();){
   Element element = (Element) it.next();
    // do something
}
  • 在某节点下添加子节点
Element ageElm = newMemberElm.addElement("age");
  • 设置节点文字
element.setText("29");
  • 删除某节点
parentElm.remove(childElm);

2.3 节点属性

  • 获取某节点下的某个属性
Element root=document.getRootElement();    
Attribute attribute=root.attribute("size");
  • 获取属性的文字
String text = attribute.getText();
  • 删除某属性
Attribute attribute=root.attribute("size");
root.remove(attribute);
  • 遍历某节点的所有属性
Element root=document.getRootElement();    
for(Iterator it=root.attributeIterator();it.hasNext();){
     Attribute attribute = (Attribute) it.next();
     String text=attribute.getText();
     System.out.println(text); 
}
  • 设置某节点的属性和文字
newMemberElm.addAttribute("name", "sitinspring");
  • 设置属性的文字
Attribute attribute=root.attribute("name");
attribute.setText("sitinspring");

2.4  将文档写入xml文件

  • 文档中全是英文,不设置编码,直接写入的形式
XMLWriter writer = new XMLWriter(new  FileWriter("output.xml"));  writer.write(document);
writer.close();
  • 文档中含有中文,设置编码格式写入的形式
OutputFormat format = OutputFormat.createPrettyPrint();
// 指定XML编码                  
format.setEncoding("UTF-8");       
XMLWriter writer = new XMLWriter(new FileOutputStream ("output.xml"),format);
writer.write(document);
writer.close();

2.5 在指定位置插入节点

  • ①得到插入位置的节点列表
  • ②调用add(index,element),由index决定element的插入位置
  • ③element元素可以通过DocumentHelper对象得到
  • 示例:
Element aaa = DocumentHelper.createElement("aaa");
aaa.setText("aaa");

List list = root.element("书").elements();
list.add(1, aaa);

//更新document

XML (二)的更多相关文章

  1. Java SE之XML<二>XML DOM与SAX解析

    [文档整理系列] Java SE之XML<二>XML DOM与SAX解析 XML编程:CRUD(Create Read Update Delete) XML解析的两种常见方式: DOM(D ...

  2. JavaScript操作XML(二)

    上一篇介绍了XML的结构以及节点之间的关系这一篇介绍浏览器内建的XML解析器以及JavaScript是如何加载XML的. 大多数浏览器都有读取和操作 XML 的内建 XML 解析器. 解析器(XML ...

  3. Hibernate映射文件详解(News***.hbm.xml)二

    转自 http://blog.csdn.net/a9529lty/article/details/6454924 一.hibernate映射文件的作用: Hibernate映射文件是Hibernate ...

  4. 用javascript操作xml(二)JavaScript 将XML转换成字符串(xml to string)

    function xmlToString(xmlData) { var xmlString; //IE if (window.ActiveXObject){ xmlString = xmlData.x ...

  5. Xml二(解析思想)、

    XML解析: * 解析xml可以做: * 如果xml作为配置文件:读取 * 如果xml作为传输文件:写,读 * xml解析思想: * DOM:将文档加载进内存,形成一颗dom树(document对象) ...

  6. XML二

    XML的语法要求: 1,XML文档必须有一个顶层元素,即文档元素,所有其他元素必须嵌入在文档元素中. 2,元素嵌套要正确,即如果一个元素在另一个元素中开始,那么必须在同一个元素中结束. 3,每个元素必 ...

  7. Android之使用XMLPull解析xml(二)

    转自:http://www.blogjava.net/sxyx2008/archive/2010/08/04/327885.html 介绍下在Android中极力推荐的xmlpull方式解析xml.x ...

  8. XML介绍

    XML [TOC] 1.XML简介 XML是Extend Markup Langue可扩展标签语言,标签由开发着自己定义 作用是: 1.描述带关系的数据(作为软件的配置文件):包含与被包含的关系 2. ...

  9. XML增、删、改

    今天有个需求需要操作xml节点.突然见遗忘了许多.上网看了些资料.才整出来.脑袋真不够用.在这里把我找到的资料共享一下.方便以后使用.本文属于网摘/ 一.简单介绍 using System.Xml; ...

  10. JavaScript操作XML

    JavaScript操作XML (一) JavaScript操作XML是通过XML DOM来完成的.那么什么是XML DOM呢?XML DOM 是: 用于 XML 的标准对象模型 用于 XML 的标准 ...

随机推荐

  1. The `XXXX` target overrides the `HEADER_SEARCH_PATHS` build setting defined in `Pods/Target Support Files/Pods-game-desktop/Pods-game-desktop.release.xcconfig'. This can lead to prob

    The `game-desktop [Release]` target overrides the `HEADER_SEARCH_PATHS` build setting defined in `Po ...

  2. 关于乱序(shuffle)与随机采样(sample)的一点探究

    最近一个月的时间,基本上都在加班加点的写业务,在写代码的时候,也遇到了一个有趣的问题,值得记录一下. 简单来说,需求是从一个字典(python dict)中随机选出K个满足条件的key.代码如下(py ...

  3. 数据结构-栈(应用篇)之快速排序法-C和C++的实现

    一.原理解析 快速排序法: 基本思路是,从第一个元素开始,把所有比它大的元素放在它后面,把所有比它小的元素放前面.然后划分它前面和后面的所有元素,分别再做快速排序,直到无法再划分为止. 在以下程序案例 ...

  4. laravel ORM 命令2

    一.查询 获取数据库所有数据 Model::all() 获取指定条件数据 Modle::where('status','1')->get() 获取第一条数据 Model::where('stat ...

  5. Struts2中访问web元素的四种方式

    Struts2中访问web元素的四种方式如下: 通过ActionContext来访问Map类型的request.session.application对象. 通过实现RequestAware.Sess ...

  6. java_web学习(三) eclipse_jsp学习

    1.首先打开eclipse,新建一个Dynamac web project项目文件 2.在WebContent单击右键创建JSP File 3.过程 4.简单的jsp代码 运行结果: 5.导出war文 ...

  7. MongoDB入门学习笔记之简介与安装配置

    一.MongoDB简介 1.文档数据库 MongoDB是一款开源的文档型非关系数据库,具有高性能.高可靠性和自动扩展等特点.MongoDB中的每一条记录是一个文档,其数据存储结构为键/值对,类似JSO ...

  8. HDU1159-Common Subsequence-LCS

    上次写题解写到一半,写的比较具体,没写完,忘记存草稿了...导致现在没心情了. Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    ...

  9. flume1.8 Sinks类型介绍(三)

    1. Flume Sinks 1.1 HDFS Sink 该sink把events写进Hadoop分布式文件系统(HDFS).它目前支持创建文本和序列文件.它支持在两种文件类型压缩.文件可以基于数据的 ...

  10. javascript 对象-13

    对象 无序属性的集合,属性可以包含基本值.对象或者函数,简单理解为对象是若干属性的集合:我们常说的面向对象(oop)编程其实是指的一种编码的思想,简单理解为用对象来封装数据,利用封装.继承.多态对代码 ...