对XML文件的重新认识,说说XML文件的二三事(三):XML两类解析模式(2)-DOM类解析XML

常见的DOM类解析器主要分为三种,DOM解析器,JDOM解析器以及DOM4J解析器。后两种主要在第一种的基础上简化演变过来的。三种之间的对比如下表格:

解析器

说明

优点

缺点

DOM

一种支持跨平台的底层API,构建类树形数据结构,其代码包在org.w3c.dom

1.  跨平台的底层API。

2.  可以修改XML文件。

 

性能较差,对于大于10M的XML文件解析较差。

JDOM

针对JAVA的一款改进解析器,即简化了API以及使用了Collections类,jdom2的jar包

1.  简化了API并使用了大量的集合类,有利于java开发人员使用。

 

性能较差,对于大于10M的XML文件解析较差。

DOM4J

是JDOM的一个分支,增加了对大文档的处理,包在dom4j的jar包中

1.性能较快,增加了对大文档的处理。集成了Xpath。

可移植性较差

 

一,DOM解析器:

1.DOM解析器的步骤可以分为如下四个步骤:

1)创建解析工厂类实例factory

2)利用factory生成一个解析器builder

3) 创建需要解析的文档Doc

4)获取根元素root并获取相关标签元素

2.实例代码如下

import java.io.File;

 

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

 

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.NamedNodeMap;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

 

 

publicclassDOMParser {

  publicstatic void main(String[] args)throws Exception {

        //1.创建解析器工厂实例

        DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();

         //2.并生成解析器

        DocumentBuilder builder =factory.newDocumentBuilder();

        //3.创建需要解析的文档对象

        File f = new File("src\\User.xml");

        Document doc = builder.parse(f);

        //4.获取文档根元素

        Element root =doc.getDocumentElement();

        

        //上面找到了根节点,这里开始获取根节点下的元素集合

        NodeList list =root.getElementsByTagName("user");

        

        for (int i = 0; i < list.getLength(); i++) {

            //通过item()方法找到集合中的节点,并向下转型为Element对象

            Element n = (Element) list.item(i);

           //获取对象中的属性map,用for循环提取并打印

            NamedNodeMap node =n.getAttributes();

            for (int x = 0; x < node.getLength(); x++) {

                Node nn = node.item(x);

                System.out.println(nn.getNodeName()+": "+ nn.getNodeValue());

            }

            //打印元素内容

            System.out.println("name: "+n.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());

            System.out.println("age: " +n.getElementsByTagName("age").item(0).getFirstChild().getNodeValue());

        }

   }

}

3.测试结果为:

id: 1

name: 小红

age: 19

id: 2

name: 小明

age: 17

id: 3

name: 小黄

age: 18

二.JDOM

1.JDOM作为延伸自DOM的面向java的解析器,其步骤和DOM大同小异,主要步骤如下:

1)生成解析器builder

2)创建需要解析的文档doc

3)获取doc的根元素root

2.示例代码如下:

import java.io.IOException;

import java.util.List;

 

import org.jdom2.Document;

import org.jdom2.Element;

import org.jdom2.JDOMException;

import org.jdom2.input.SAXBuilder;

 

 

publicclassJDOMParser {

publicvoidparserXml() throwsJDOMException, IOException{

  //1.生成解析器builder

  SAXBuilderbuilder = newSAXBuilder();

  //2.创建需要解析的文档doc

  Documentdoc=builder.build("src\\User.xml");

  //3.获取doc的根元素root

  ElementeleUsers=doc.getRootElement();

  //根据User标签获取所有的子节点元素

  ListuserList=eleUsers.getChildren("user");

  for(inti=0;i<userList.size();i++){

     Elementuser=(Element) userList.get(i);

     System.out.println(user.getName());

     ListuserAttribute=user.getChildren();

     for(intj=0;j<userAttribute.size();j++)

     {

     System.out.println(((Element)userAttribute.get(j)).getName()+((Element)userAttribute.get(j)).getValue());

      

      

     }

  }

}

 publicstaticvoidmain(String args[])throws JDOMException, IOException{

   new JDOMParser().parserXml();

 }

}

3.测试如下:

user

name小红

age19

user

name小明

age17

user

name小黄

age18

三.DOM4J

1.作为DOMJ的一个智能分支,可以看到DOM4J的解析步骤和DOMJ没有什么区别,其步骤如下:

1)生成解析器SAX

2)解析生成文档doc

3)获取doc的根元素root

2.其主要实例代码如下:

public Element getRootelement()throws DocumentException{

  //1.生成解析器SAX

  SAXReadersaxRe=newSAXReader();

  //2.解析生成文档doc

  Documentdoc=saxRe.read(newFile("src/TestParser.xml"));

  //3.获取doc的根元素root

  Elementroot=doc.getRootElement();

  return root;

}

总结:三个DOM类的解析器使用步骤都大同小异,无非就是获取解析器,然后把要解析的XML文档转换为Document类文档,然后最终得到我们需要的根元素Root,随后对根元素的子元素进行遍历。JDOM 和 DOM 在性能上面表现的并不好,文档大于10M的时候会出现内存溢出的情况。而DOM4J是最好的,目前许多开源项目中大量采用DOM4J,如果不考虑可移植性,那就采用DOM4J吧!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值