JAVA中的XML文件--文件读取(下)

JDOM和DOM4J方式是非JAVA官方提供的,需要另外下载jar包,下载地址分别为:
JDOM : http://www.jdom.org/downloads/
DOM4J : http://dom4j.github.io/

2.3 应用JDOM方式解析XML

2.3.1 准备工作

  • 通过new获取SAXBuilder对象:

    SAXBuilder saxbuilder = new SAXBuilder();
  • 使用SAXBuilder下的build()方法解析XML,build方法的参数可以直接是一个XML文件路径,也可以是一个InputStream,使用InputStream的实现类来解析XML文件,然后将输入流加载到saxBuilder中,build()方法将返回一个Document变量:

    InputStream in = new FileInputStream("students.xml");
    Document document = saxbuilder.build(in);
  • 根据Document中的getRootElement()方法获取XML文件中的根元素(返回类型为Element),进而通过getChildren()获取它的子元素的集合List;

    Element rootElem = document.getRootElement();
    List<Element> childElemList = rootElem.getChildren();

备注:
1. 注意InputStream和build()会抛出异常;
2. Document和SAXBuilder等均来自org.jdom2包,下同;

2.3.2 解析元素的属性和子元素

  • 在上一节获取到了XML中的根元素Element和子元素集合List,遍历每一个元素的方式不再赘述;

    for(Element child : childElemList){
         ……;
    }
  • 对于每一个元素,通过getAttributes()方法获取每个元素的属性集合List,对于每个属性通过getName()和getValue()方法获取属性名和属性值:

    List<Attribute> attrList = child.getAttributes();
    for(Attribute attr : attrList){
        System.out.println(attr.getName()+","+attr.getValue());
    }

    如果想要获取某个元素给定的属性可以直接使用getAttribute(String AttributeName);

  • 获取元素的子元素和上述相同,使用getChildren()方法得到一个子元素集合List。

备注:
1. 与之前不同的是:无论什么类型的元素,getName()得到的都是元素的名称,getValue()得到的都是元素内的文本,不会保留空格和回车组成的文本,都是有实际值的文本;

2.3.3 JDOM解析时乱码问题的处理

当发现解析出来的XML文件出现乱码时,可以进行下述检查和修改:

  • 查看XML文件中声明处的编码方式,可以修改为和文本兼容的编码方式,如UTF-8等;

  • 不修改编码方式,可以对代码进行修改,在build()方法中不传递FileInputStream类型的参数,改为InputStreamReader,该类可以接收指定的编码方式:

    FileInputStream in = new FileInputStream("students.xml");
    InputStreamReader isr = new InputStreamReader(in,"UTF-8");
    Document document = new Document(isr);

    其实道理和第一种相同.

备注:
1.SAXBuilder,Document,Element和Attribute均来自org.jdom2包。

2.4 使用DOM4J解析XML

  • 创建一个SAXReader的对象:

    SAXReader saxreader = new SAXReader();
  • 通过SAXReader的read()方法加载book.xml文件,获取Document对象,read()方法不可以通过直接传文件路径的方式加载XML文件,可以通过传递File对象作为参数来加载XML:

    Document document = saxreader.read(new File("students.xml"));
  • 同样通过document对象的getRootElement()方法获取xml的Element类型的根元素,Element类下有elementIterator()方法用于获取子元素,返回一个元素的迭代器:

    Element school = document.getRootElement();
    Iterator it = school.elementIterator();
  • 遍历迭代器获取元素中的信息,根据迭代器中的hasNext()判断是否还有需要的元素,通过next()方法遍历每个元素,通过attributes()方法得到元素属性的集合List,通过Element(或Attribute)的getName()方法获取元素名(或属性名),通过getStringValue()得到元素包含的文本内容,通过getValue()得到属性值:

    while(it.hasNext()){
    Element student = (Element)it.next();
    List<Attribute> attrList = student.attributes();
    for(Attribute attr : attrList){
        System.out.println(attr.getName()+","+attr.getValue());
        }
    }
  • 同样的可以继续通过elementIterator()方法获取子元素的迭代器。

备注:
1. 注意捕获异常;
2. 迭代器中的next()方法返回的是Object类型,需类型转换为Element;
3. Attribute、Document、Element和SAXReader类均来自org.dom4j包。

3 四种解析方式的比较

  • 基础方式:DOM和SAX,不需要导入jar包
    • DOM方式与平台无关,不仅仅是java平台有,其他许多平台也有;
    • SAX方式是基于事件驱动的解析方式,适用于处理数据流,即随着数据的流动而依次处理数据
  • 扩展方式:JDOM和 DOM4J,在基础的方法上的扩展,只有java中能使用的解析方式。

3.1 DOM方式

一次性的将xml中所有的内容加载进内存中,并形成一个DOM树,当xml比较大的时候,会浪费时间.

  • 优点
    • 形成了树结构,直观好理解,代码更易编写
    • 解析过程中树结构保留在内存中,便于修改
  • 缺点
    • 当XML文件较大时,对内存耗费比较大,容易影响解析性能并造成内存溢出

3.2 SAX方式

当使用SAX对XML文档解析时,会触发一系列事件,激活相应的事件处理方法(如:startDocument()和endDocument()方法在xml开始和结束时调用,startElement()和endElement()方法在每个元素解析和结束时调用等),应用程序通过这些事件处理函数实现对XML文档的访问。

  • 优点
    • 采用事件驱动模式,对内存消耗比较少
    • 适用于只需要处理xml中数据时,不需要知道XMl文件中的结构
  • 缺点
    • 不易编码,如将XML内容转化为对应的类实例时较其他方式不易编码
    • 由于事件触发的时序性,分析过的内容不能再倒回去重新处理

3.3 JDOM方式

  • 仅使用具体类而不是用接口
  • API大量使用Collections类,便于操作

3.4 DOM4J方式

  • JDOM的一种智能分支,它合并了许多超出XML文档表示的功能
  • DOM4J使用接口和抽象基本类方法
  • 性能优异、灵活性好,功能强大和极易使用
  • 开放源代码软件

不断学习不断总结^_^。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值