`

XML学习之旅一 ——XML解析器

阅读更多

        因为最近做一个考试系统项目的需要,开始学习XML.
       

        XML在java中的使用越来越广泛,掌握几种常用的XML解析器十分有必要。目前XML主要的解器有DOM,SAX和JDOM.
        DOM是一套为合法的Well-Formed文件设计的API应用程序接口,它同时定义了这些文件的逻辑结构,访问和操作方法.由W3C制定,目标是提供一个可以通用于各种程序语言,操作系统和应用程序的API,所以DOM具有极高的兼容性.
        SAX(Simple Application interface for XML)是一个为基于事件XML解析器定义的,可以免费获得的,与平台语言无关的API,它允许程序和脚本动态的访问和更新文档的内容,结构和风格.
        JDOM是两位著名的 Java 开发人员兼作者,Brett Mclaughlin 和 Jason Hunter 的创作成果,它是一个开源项目,它基于树型结构,利用纯Java的技术对XML文件实现解析,生成,序列化以及其他许多操作.JDOM直接为Java编程服务,它利用强有力的Java语言的诸多特性,把SAX和DOM的功能有效地结合起来,在使用设计上尽可能地隐藏原来使用过程中的复杂性.
        
        对于DOM和SAX在API中能直接找到,其中包含了三个软件包:

              ·org.w3c.dom ,W3C 推荐的用于 XML 标准规划文档对象模型的 Java 工具 
              ·org.xml.sax ,用于对 XML 进行语法分析的事件驱动的简单 API 
              ·javax.xml.parsers ,工厂化工具,允许应用程序开发人员获得并配置特殊的语法分析器工具 JDOM 能够替换 
     
         JDOM是一个开源项目,使用时需要导入jdom.jar到库中。相对于直接使用API中的解析器,JDOM使用起来要更简单得多。JDOM 在2000年的春天被Brett McLaughlin和Jason Hunter开发出来,以弥补DOM及SAX在实际应用当中的不足之处。下面我们通过一个实际的例子,分别使用两种方式实现解析xml的试题文件来比较两者的不同。

        本次需要解析的XML文件Item.xml
        <?xml version="1.0" encoding="UTF-8"?>
        <list>
          <item id="1">
            <answer>C</answer>
            <level>1</level>
            <question>在下列存储器中,访问速度最快的是:_______
                    A) 硬盘存储器
                   B) 软盘存储器
                   C) 半导体RAM(内存储器)
                   D) 磁带存储器</question>
            <questionType>基础题</questionType>
          </item>
          <item id="2">
            <answer>D</answer>
            <level>1</level>
            <question>下面是关于微型计算机操作的四条叙述,其中正确的一条是:_______
               A)系统不会用输入日期做任何事,可以随便输入过去一个日期作当天日期
               B) 用户每键入一个字符时,DOS就立即将其读取并识别之
               C) 启动DOS系统时,如不想输入新时间,用户只按下任意键就行
               D)软盘可以在切断电源之前取出来,也可以在切断电源之后取出来</question>
            <questionType>基础题</questionType>
          </item>
        </list>

 同过使用DOM和SAX对Item.xml进行解析DomExample.java
 

package action;

 /**
 *
 * @author weiqishaonian
 */
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import java.util.logging.Level;
import java.util.logging.Logger;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
//下面主要是org.xml.sax包的类
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class DomExample {

    private Document doc;
    private InputStream is = null;

    public DomExample(String xmlFilePath) {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();//(1)得到DOM解析器的工厂实例
            DocumentBuilder db = dbf.newDocumentBuilder();//(2)从DOM工厂获得DOM解析器
            is = new FileInputStream(xmlFilePath);//(3)把要解析的XML文档转化为输入流,以便DOM解析器解析它
            doc = db.parse(is);//(4)解析XML文档的输入流,得到一个Document
            Element emt = doc.getDocumentElement();//(5)得到XML文档的根节点
            NodeList list = emt.getChildNodes();//(6)得到节点的子节点
            if (list != null) {
                for (int i = 0; i < list.getLength(); i++) {
                    Node item = list.item(i);
                    if (item.getNodeType() == Node.ELEMENT_NODE) {
                        //(7)取得节点的属性值
                        String id = item.getAttributes().getNamedItem("id").getNodeValue();
                        System.out.println(id);
                        //(8)轮循子节点
                        for (Node node = item.getFirstChild(); node != null; node = node.getNextSibling()) {
                            if (node.getNodeType() == Node.ELEMENT_NODE) {
                                if (node.getNodeName().equals("answer")) {
                                    String answer = node.getFirstChild().getNodeValue();//得到试题答案
                                    System.out.println(answer);
                                }
                                if (node.getNodeName().equals("level")) {
                                    String level = node.getFirstChild().getNodeValue();//得到试题等级
                                    System.out.println(level);
                                }
                                if (node.getNodeName().equals("question")) {
                                    String question = node.getFirstChild().getNodeValue();//得到试题
                                    System.out.println(question);
                                }
                                if (node.getNodeName().equals("questionType")) {
                                    String questionType = node.getFirstChild().getNodeValue();//得到试题类型
                                    System.out.println(questionType);
                                }
                            }
                        }
                    }
                }
            }
            is.close();
        } catch (SAXException ex) {
            Logger.getLogger(ItemXMLParser.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ItemXMLParser.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParserConfigurationException ex) {
            Logger.getLogger(ItemXMLParser.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void main(String[] args) {
        System.out.println("===========================================");
        new DomExample("D:/item.xml");
        System.out.println("===========================================");
    }

}

 运行结果:
run-single:
===========================================
1
C
1
在下列存储器中,访问速度最快的是:_______
   A) 硬盘存储器
   B) 软盘存储器
   C) 半导体RAM(内存储器)
   D) 磁带存储器
基础题
2
D
1
下面是关于微型计算机操作的四条叙述,其中正确的一条是:_______
   A)系统不会用输入日期做任何事,可以随便输入过去一个日期作当天日期
   B) 用户每键入一个字符时,DOS就立即将其读取并识别之
   C) 启动DOS系统时,如不想输入新时间,用户只按下任意键就行
   D)软盘可以在切断电源之前取出来,也可以在切断电源之后取出来
基础题
===========================================
BUILD SUCCESSFUL (total time: 0 seconds)

同过使用JDOM对Item.xml进行解析JDomExample.java

package action;

/**
 *
 * @author weiqishaonian
 */
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class JDomExample {

    public JDomExample(String xmlFilePath) {
        try {
            SAXBuilder sb = new SAXBuilder();//
            Document doc = sb.build(new FileInputStream(xmlFilePath));
            Element root = doc.getRootElement(); //得到根元素
            List items = root.getChildren(); //得到根元素所有子元素的集合
            for (int i = 0; i < items.size(); i++) {
                Element item = (Element) items.get(i); //得到第i个item元素
                System.out.println(item.getAttribute("id").toString());
                Element answer = item.getChild("answer"); //得到试题答案
                System.out.println(answer.getText());
                Element level = item.getChild("level"); //得到试题等级
                System.out.println(level.getText());
                Element question = item.getChild("question"); //得到试题
                System.out.println(question.getText());
                Element questionType = item.getChild("questionType"); //得到试题类型
                System.out.println(questionType.getText());
            }
        } catch (JDOMException ex) {
            Logger.getLogger(JDomExample.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(JDomExample.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void main(String[] args) {
        System.out.println("===========================================");
        new JDomExample("D:/item.xml");
        System.out.println("===========================================");
    }
}

 运行结果:
run-single:
===========================================
[Attribute: id="1"]
C
1
在下列存储器中,访问速度最快的是:_______
   A) 硬盘存储器
   B) 软盘存储器
   C) 半导体RAM(内存储器)
   D) 磁带存储器
基础题
[Attribute: id="2"]
D
1
下面是关于微型计算机操作的四条叙述,其中正确的一条是:_______
   A)系统不会用输入日期做任何事,可以随便输入过去一个日期作当天日期
   B) 用户每键入一个字符时,DOS就立即将其读取并识别之
   C) 启动DOS系统时,如不想输入新时间,用户只按下任意键就行
   D)软盘可以在切断电源之前取出来,也可以在切断电源之后取出来
基础题
===========================================
BUILD SUCCESSFUL (total time: 0 seconds)

        通过上面两个文件比较,我们可以明显的看出区别。JDOM解析要比使用DOM和SAX进行解析使用起来更简单,完成同样的功能用JDOM比使用DOM和SAX要少很多代码(请看DomExample.java和JDomExample.java文件),而且使用JDOM的代码看起来更为清晰。JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及映射),把SAX和DOM的功能有效地结合起来。 Jdom是用Java语言读、写、操作XML的新API函数。Jason Hunter 和 Brett McLaughlin公开发布了它的1.0版本。在直觉、简单和高效的前提下,这些API函数被最大限度的优化。在接下来的篇幅里将介绍怎么用Jdom去读写一个已经存在的XML文档。在使用设计上尽可能地隐藏原来使用XML过程中的复杂性。利用JDOM处理XML文档将是一件轻松、简单的事。

 

1
0
分享到:
评论

相关推荐

    小读spring ioc源码(一)——整体介绍

    《Spring IOC源码解析(一)——整体介绍》 在深入理解Spring框架的过程中,源码分析是不可或缺的一环。本文将对Spring的IOC(Inversion of Control,控制反转)...希望本文能为你开启Spring源码探索之旅的第一步。

    我们一起读文档,学习MyBatis(一)----------- 一个简单demo的实现

    MyBatis是一个流行的Java持久层框架,它简化了数据库操作,允许开发者将SQL语句直接映射到Java代码中...通过这个简单的Demo,你可以开始踏上MyBatis的学习之旅。记住,实践是最好的老师,动手尝试是理解MyBatis的关键。

    dtds.zip_Help!

    之后,在查看XML数据流时,选择显示DTD信息的选项,即可开始我们的调试之旅。 总结来说,DTDs.zip_Help! 提供的Ethereal DTD插件是XML开发者和网络分析员的强大工具,它将复杂的XML结构可视化,辅助我们快速定位和...

    Android开发教程(环境搭建与解析).rar

    关于解析,Android提供了一系列的XML解析库,如DOM、SAX和Pull解析器。在Android开发中,通常使用Pull解析器因为它效率高且内存占用少。学习XML解析可以帮助你处理来自网络或本地文件的数据。 最后,实践是检验理论...

    2011.09.21——— android 动态壁纸开发

    【Android动态壁纸开发详解】 Android动态壁纸是一种可以让用户在手机主屏幕上看到动态效果的...通过提供的博客链接和`MyLiveWallpaper`源码,读者可以更直观地学习这一技术,从而开启自己的Android动态壁纸开发之旅。

    全面解析DIV+CSS静态网页教程

    在网页设计领域,DIV+CSS是一种广泛应用于构建页面布局的技术,它使得网页的结构与样式分离,提高了网页的可维护性和可访问性。...现在就开始你的学习之旅吧,十天后,你将拥有构建专业静态网页的能力!

    calc_4_3.zip_android

    在Android开发的世界里,初学者常常需要一个清晰易懂的实例来开启他们的编程之旅。"calc_4_3.zip"就是一个这样的例子,它提供了一个简单的计算器程序,旨在帮助新手学习Java在Android平台上的应用。本文将深入剖析这...

    spring入门

    Spring框架是Java开发中的核心组件,它为..."Spring入门"资源包是你踏上Spring学习之旅的理想起点,通过学习文档、观看视频和实践源码,你将能够逐步掌握Spring的关键特性和应用技巧,为你的Java开发生涯打下坚实基础。

    zengarden 禅意花园 CSS HTML

    《CSS与HTML设计艺术——禅意花园解析》 ...所以,如果你对网页设计有着无尽的热爱,不妨下载禅意花园的资源,亲自尝试,去体验那份设计的乐趣和挑战,你会发现,每一次的修改都是一次美妙的禅修之旅。

    android 开发入门教程 从配置环境开始

    Android开发入门教程从...通过这个详尽的教程,你将不仅学会Android开发的基本技能,还能掌握解决实际问题的能力,为你的Android开发之旅打下坚实的基础。在实践中不断学习和提升,你将成为一名出色的Android开发者。

    2本Java Script教程下载.zip

    JavaScript是一种广泛应用于网页和互联网应用开发的脚本语言,它主要负责实现客户端的交互效果,增强用户界面。在本教程中,我们将深入探讨JavaScript的核心概念...现在,就让我们一起开始这段JavaScript的学习之旅吧!

    android实战-热点新闻app(包括操作说明书,系统环境及功能简介,源代码文档)

    安装Android Studio后,你可以创建新的Android项目,并选择合适的模板开始你的新闻应用之旅。 二、项目结构 在创建新项目时,Android Studio会自动生成一个标准的项目结构,包括`app`模块,其中包含`java`、`res`等...

    alchemy-game:我正在研究的另一个游戏项目! 当前使用SDL2和SDL_image 2

    《炼金术游戏:探索C++游戏开发的深度与魅力》 在游戏开发的世界里,各种工具和技术的组合为开发者提供了无限的创新空间。...对于希望学习游戏开发的人来说,深入研究这个项目将是一次宝贵的学习之旅。

    【高清MP4格式可放到IPAD中】mars老师android开发教程全集迅雷下载.torrent

    《Android开发教程全集——mars老师高清视频指南》 在当今移动互联网时代,Android作为全球最流行的智能手机操作系统之一,其应用开发技术的需求...只需一个高清MP4格式的视频,即可随时随地开启你的Android开发之旅。

    iphone应用教程

    学习iPhone应用开发不仅可以帮助你更好地理解和利用这些工具,甚至可能开启你的创业之旅或职业发展新路径。本教程将深入浅出地介绍iPhone应用的开发流程,旨在帮助初学者快速入门。 首先,我们要了解iPhone应用开发...

    企鹅与海龟数据集.zip

    《企鹅与海龟数据集:开启计算机视觉的探索之旅》 在当今信息化时代,计算机视觉作为一门重要的技术,正在引领我们进入一个全新的感知世界。它使得机器能够理解和解析图像,进而实现诸多智能应用,如自动驾驶、人脸...

    vsflexgrid8

    对于学习者来说,它提供了一个深入理解和实践表格控件设计原理的绝佳平台,让编程之旅充满乐趣。 【标签】:“vb”:VsFlexGrid8是基于VB环境开发的,可以无缝集成到VB6或VB.NET项目中,为VB应用程序增加强大的表格...

    Spring+SpringMVC+MyBatis(SSM)实用项目整合案例(包含多个可运行项目)

    《Spring+SpringMVC+MyBatis(SSM)实用项目整合详解》 Spring、SpringMVC和MyBatis作为Java开发中的三大框架,被广泛应用于...不断实践和研究,你将能够灵活地应用SSM框架,为你的Java Web开发之旅打下坚实的基础。

    npp.5.8.7.bin

    《全面解析:Notepad++ 5.8.7——高效文本编辑器的探索与应用》 Notepad++,一个在IT行业中广受好评的文本编辑工具,以其强大的功能和便捷的操作体验,赢得了众多程序员和文本工作者的喜爱。版本号为5.8.7的Notepad...

    精通Grails 之用 JSON 和Ajax 实现异步Grails(pdf电子书)

    在文章的部分内容中提到的示例应用——旅行计划页面,是通过1个GSP文件和3个控制器实现的,总共约150行代码。这个应用包括以下功能: 1. **用户输入**:用户可以输入出发地机场和目的地机场。 2. **地图展示**:...

Global site tag (gtag.js) - Google Analytics