`
Irving_wei
  • 浏览: 133082 次
  • 性别: Icon_minigender_1
  • 来自: Heaven
社区版块
存档分类
最新评论
阅读更多
      XML 技术是随着 Java 的发展而发展起来的。在 XML 出现之前对于简单的数据格式通常是存储在 ini 配置文件等文本文件中,复杂的格式则采用自定义的文件格式,因此对于每种文件格式都要有专门的解析程序。 XML 出现以后解决了这个问题,程序面对的是有固定格式的 XML 文件,只要通过标准 API 就可以进行 XML 文件的处理。

XML 文件在案例系统中应用是很广泛的,比如 ClientConfig.xml 、 ServerConfig.xml 文件就是使用 XML 文件来做配置文件的,元数据文件以及元数据加载器更是离不开 XML 。因此本章将系统讲解一下 XML 文件的处理技术。

1.1    XML 处理技术比较
在 Java 领域 XML 文件的技术大致分为两类: XML API 和 OXMapping 。 XML API 是 XML 处理的基础,可选技术包括 JDOM 、 Dom4j 等; OXMapping 是 Object-XML Mapping 的简称,这种技术隐藏了 XML 底层操作的细节,可以将 XML 文件映射成一个 JavaBean 对象,也可以把一个 JavaBean 对象保存成一个 XML 文件,可选技术 XStream 、 Digester 、 Castor 等。 XML API 和 OXMapping 的关系类似于 JDBC 和 ORMaping 的关系, OXMapping 内部实现使用 XML API 来完成,两种实现技术从不同的层面实现了 XML 的处理。

XML API

此类 XML 处理技术中最流行的莫过于 JDOM 和 Dom4j 了,二者的使用方式非常相似。不过 Dom4j 的优势比 JDOM 更明显一些:

Dom4j 大量的使用接口,这使得 Dom4j 比 Dom4j 更加灵活和具有可扩展性;

Dom4j 的性能表现比 JDOM 好;

Dom4j 支持 XPath 等高级特性;

正是由于这些优点,很多开源项目都开始使用 Dom4j 做 XML 解析技术,本书也将使用 Dom4j 做为 XML 处理的首选。

OXMapping

使用 XML API 解析是略显烦琐的,受 ORMapping 技术的启发,人们发明了 OXMapping 技术,使用 OXMapping 技术,我们可以将 XML 文件映射成一个 JavaBean 对象,也可以把一个 JavaBean 对象保存成一个 XML 文件,这大大简化了我们的开发工作量,使得开发人员能更多的关注应用层面的东西。

开源世界中涌现出很多 OXMapping 框架,包括 XStream 、 Digester 、 Castor 等。 XStream 和 Digester 把映射的过程在代码中完成,而 Castor 则需要写一个和 Hibernate 中 cfg.xml 类似的映射配置文件。与 Digester 比起来, XStream 的主要优点就是更加小巧,使用也更加方便,不过目前使用 Digester 是“开源名牌” Apache 下的子项目,网上可以参考的资料也比 XStream 多,好在 XStream 比较简洁,所以并不会对 XStream 造成太大影响。

1.2    Dom4j 的使用
    Dom4j 是一个易用的、开源的库,用于 XML , XPath 和 XSLT 。它应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM , SAX 和 JAXP 。 Dom4j 是 sourceforge.net 上的一个开源项目,地址为 http://sourceforge.net/projects/dom4j 。

    Dom4j 里基于接口编程是一个非常显著的优点,下面是其主要的接口的继承体系结构图:



图 5 . 1

这些接口大部分都是定义在包 org.dom4j 中,下面简单介绍各个接口的意义:

表 5 . 1 Dom4j 主要接口

Node
Node 为是 dom4j 中所有的 XML 节点的基类型接口

Attribute
Attribute 定义了 XML 的属性

Branch
Branch 为能够包含子节点的节点如 XML 元素 (Element) 和文档 (Docuemnts) 定义了一个公共的行为

Document
定义了 XML 文档

Element
Element 定义 XML 元素

DocumentType
DocumentType 定义 XML DOCTYPE 声明

Entity
Entity 定义 XML entity

CharacterData
CharacterData 是一个标识借口,标识基于字符的节点。如 CDATA , Comment, Text

CDATA
CDATA 定义了 XML CDATA 区域

Comment
Comment 定义了 XML 注释的行为

Text
Text 定义 XML 文本节点

ProcessingInstruction
ProcessingInstruction 定义 XML 处理指令






读取 XML 文件

在 XML 应用中,最常用的莫过于 XML 文件的解析读取了, Dom4j 提供了多种读取 XML 文档的方式,包括 Dom 树遍历、 Visitor 方式和 XPath 方式。

无论哪种方式,我们首先都要根据 xml 文件构造一个 Document 对象:

SAXReader reader = new SAXReader();

Document document = reader.read(new File(fileName));

这里我们选用了 SAXReader 做为 XML 读取器,我们同样也可以选择 DOMReader 做为 XML 读取器:

SAXReader reader = new DOMReader();

Document document = reader.read(new File(fileName));

其中 reader 的 read 方法有多个重载方法,可以从 InputStream, File, URL 等多种不同的源来读取 XML 文档。




( 1 ) Dom 树遍历

这种读取方式中把 Dom 看成一个普通的树,要读取 XML 中某个节点的值,只要采用数据结构中的树遍历算法定位到需要读取的节点即可。

要便利 Dom 树,首先要取得树的根节点:

Element root = document.getRootElement();

取得根节点以后就可以一级一级的向下读了:

// 遍历所有子节点

for ( Iterator i = root.elementIterator(); i.hasNext(); )

{

       Element element = (Element) i.next();

       // do something

    }

    // 遍历名称为“ foo ”的节点

for ( Iterator i = root.elementIterator( “ foo ” ); i.hasNext();)

{

       Element foo = (Element) i.next();

       // do something

    }

    // 遍历属性

for ( Iterator i = root.attributeIterator(); i.hasNext(); )

{

       Attribute attribute = (Attribute) i.next();

       // do something

}




( 2 ) Visitor 方式

Dom 树遍历是最普通,也是最常用的 XML 读取方式,其他的 XML 解析引擎,比如 JDom 等,也是使用这种方式进行 XML 的读取。不过 Dom4j 提供了另外一种读取方式,那就是 Visitor 方式。这种方式实现了 Visitor 模式,调用者只要编写一个 Visitor 就可以了。 Visitor 模式使得访问者易于增加新的操作,同时使访问者集中相关的操作而分离无关的操作。

编写的 Visitor 必须实现 org.dom4j.Visitor 接口, Dom4j 还提供了一个 Default Adapter 模式的默认适配器 org.dom4j.VisitorSupport 。

public class DemoVisitor extends VisitorSupport

{

public void visit(Element element)

{

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

}

public void visit(Attribute attr)

{

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

}

}

然后在要开始遍历的节点调用此 Visitor 即可:

root.accept(new DemoVisitor ())

此方式需要遍历所有的节点和元素,因此速度会稍慢一些。




( 3 ) XPath 方式

Dom4j 最吸引人的特性莫过于对 XPath 的集成支持了,这个特性并不是所有的 XML 解析引擎都支持的,但是确实一个非常有用的特性。

XPath 是寻址、搜索和匹配文档的各个部分的语言。它使用路径标记法来指定和匹配文档的各个部分,该标记法与文件系统和 URL 中使用的类似。例如, XPath:/x/y/z 搜索文档的根节点 x ,其下存在节点 y ,其下存在节点 z 。该语句返回与指定路径结构匹配的所有节点。 /x/y/* 返回父节点为 x 的 y 节点下的任何节点。 /x/y[@name=a] 匹配所有父节点为 x 的 y 节点,其属性称为 name ,属性值为 a 。

XPath 大大简化了 XML 的寻址操作,使用者只要通过匹配表达式告诉引擎要匹配文档的哪些部分即可,具体的匹配工作由 XPath 引擎来完成。这种方式更加接近于人类的自然思维方式。我们来看一个实际的例子:

有一个 XML 文件记录了一个部门的基本情况:

<?xml version="1.0" encoding="GB2312"?>

<department>

     <name> 开发部 </name>

     <level>2</level>

     <employeeList>

         <employee number="001" name="Tom" />

         <employee number="002" name="Jim" />

         <employee number="003" name="Lily" />

     </employeeList>

</department>

name 代表部门名称, level 为部门的级别, employeeList 下是部门所有的员工列表。下面编写一个程序读取此文件并打印出部门的信息。

代码 5.1 XPath 演示

InputStream inStream = null;

try

{

     inStream = Dom4jDemo01.class.getResourceAsStream(

           "/com/cownew/Char0502/Department01.xml");

     SAXReader reader = new SAXReader();

     Document doc = reader.read(new InputStreamReader(inStream));

     Node nameNode = doc.selectSingleNode("//department/name");

     System.out.println(" 部门名称 :" + nameNode.getText());


 


     Node levelNode = doc.selectSingleNode("//department/level");

     System.out.println(" 部门级别 :" + levelNode.getText());


 


     List employeeNodeList = doc

                   .selectNodes("//department/employeeList/employee");

     System.out.println(" 部门下属雇员 :");

     for (int i = 0, n = employeeNodeList.size(); i < n; i++)

     {

         DefaultElement employeeElement = (DefaultElement) employeeNodeList

                            .get(i);

         String name = employeeElement.attributeValue("name");

         String number = employeeElement.attributeValue("number");

         System.out.println(name + " ,工号 :" + number);

     }

} finally

{

     ResourceUtils.close(inStream);

}

运行结果 :

部门名称 : 开发部

部门级别 :2

部门下属雇员 :

Tom ,工号 :001

Jim ,工号 :002

Lily ,工号 :003





使用 XPath 以后,我们只要使用“ //department/name ”这种非常清晰的方式就可以直接定位到具体的节点。 XPath 方式中定位单个节点使用 selectSingleNode 方法,而定位多节点则使用 selectNodes 方法。

案例系统中所有的 XML 文件都是使用 XPath 方式进行解析的,包括 ClientConfig.java 、 ServerConfig.java 、 EntityMetaDataParser.java 等。

XML 文件的创建

Dom4j 中 XML 文件的创建和其他的 XML 引擎类似,首先以 Document 的根节点为基础构造出一棵节点树,然后调用相应的 IO 类库就可以将 XML 文件保存到适当的介质中了。




下面演示一下生成上文提到的那个部门信息 XML 文件的过程 :

代码 5.2 XML 创建演示

import java.io.FileWriter;

import java.io.IOException;


 


import org.dom4j.Document;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

import org.dom4j.io.OutputFormat;

import org.dom4j.io.XMLWriter;


 


public class Dom4jDemo02

{

     public static void main(String[] args)

     {

         // 创建文档对象

         Document document = DocumentHelper.createDocument();


 


         // 添加根节点 "department"

         Element departElement = document.addElement("department");


 


         // 添加 "name" 节点

         Element departNameElement = DocumentHelper.createElement("name");

         departNameElement.setText(" 开发部 ");

         departElement.add(departNameElement);


 


         // 添加 "level" 节点

         Element departLevelElement = DocumentHelper.createElement("level");

         departLevelElement.setText("2");

         departElement.add(departLevelElement);


 


         // 添加员工列表 "employeeList" 节点

         Element employeeElementList = DocumentHelper

                   .createElement("employeeList");

         departElement.add(employeeElementList);


 


         // 添加员工节点 "employee"

         Element emp1Element = DocumentHelper.createElement("employee");

         emp1Element.addAttribute("number", "001");

         emp1Element.addAttribute("name", "Tom");

         employeeElementList.add(emp1Element);


 


         Element emp2Element = DocumentHelper.createElement("employee");

         emp2Element.addAttribute("number", "002");

         emp2Element.addAttribute("name", "Jim");

         employeeElementList.add(emp2Element);


 


         Element emp3Element = DocumentHelper.createElement("employee");

         // 添加属性

         emp3Element.addAttribute("number", "003");

         emp3Element.addAttribute("name", "Lily");

         employeeElementList.add(emp3Element);


 


         try

         {

              writeToFile(document, "c:/department.xml");

         } catch (IOException e)

         {

              e.printStackTrace();

         }

     }


 


     private static void writeToFile(Document document, String file)

              throws IOException

     {

         // 美化格式

         OutputFormat format = OutputFormat.createPrettyPrint();

         format.setEncoding("GB2312");

         XMLWriter writer = null;

         try

         {

              writer = new XMLWriter(new FileWriter(file), format);

              writer.write(document);

         } finally

         {

              if (writer != null)

                   writer.close();

         }

     }

}

运行以后就可以在 c:/ 下发现生成了和 5.2.1 的文件内容一样的 department.xml 了。

这里有两点需要注意的:

( 1 ) OutputFormat format = OutputFormat.createPrettyPrint ()

XML 通常是需要人阅读的, Dom4j 默认的生成格式是紧缩格式的,这样可以减少空间占用,但是带来的缺点就是文件格式非常难看,因此我们采用锁紧格式进行输出。

( 2 ) format.setEncoding("GB2312")

Dom4j 默认的编码格式是“ UTF-8 ”,这在输出中文字符的时候会有问题,因此我们改成“ GB2312 ”格式。

这里使用了 Dom4j 提供的工具类 DocumentHelper 提供的 createElement 方法来创建一个节点,这个工具类还有 public static CDATA createCDATA(String text) 、 public static Comment createComment(String text) 、 public static Entity createEntity(String name, String text) 等方法可以帮助我们更快的创建节点。

DocumentHelper 还提供了 parseText 方法,可以直接将字符串解析成 Documen 对象。



(原文地址:http://swingchen.bokee.com/6220957.html )
分享到:
评论

相关推荐

    易语言 xml解析 易语言 xml解析 教程 带源码

    易语言XML解析是编程领域中的一个重要主题,尤其对于使用易语言进行开发的程序员来说,理解并掌握XML(可扩展标记语言)的解析方法是至关重要的。XML作为一种结构化数据存储和交换格式,广泛应用于网络通信、配置...

    java xml解析工具类 java xml解析工具类

    java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析...

    C# XML解析方式

    根据给定文件中的标题、描述、标签以及部分内容,可以总结并深入探讨以下关于C#中XML解析的关键知识点: ### C#中的XML解析方式 #### 1. XML Text Reader(流式解析) - **简介**:在.NET框架中,`XMLTextReader`...

    XML解析器示例

    在LabVIEW(Laboratory Virtual Instrument Engineering Workbench)这个强大的图形化编程环境中,XML解析器是处理和操作XML数据的关键工具。本示例主要展示了如何在LabVIEW中实现XML文件的加载、保存和解析。 首先...

    xml解析文件的两种方式

    本文将详细介绍XML解析文件的两种主要方式:SAX(Simple API for XML)和DOM(Document Object Model)。 **1. DOM解析** DOM解析方式是将整个XML文档加载到内存中,构建一个树形结构,称为DOM树。这个树的每个...

    XML解析和生成工具

    本文将深入探讨XML解析和生成工具的相关知识,以及如何利用提供的`Markup.cpp`和`Markup.h`文件进行操作。 XML的结构: XML文档由一系列元素构成,每个元素都有一个开始标签和结束标签,如 `&lt;tag&gt;` 和 `&lt;/tag&gt;`。...

    XML解析 很全 一看就懂的东东

    在Java中,XML解析有四种主要的方法:DOM、SAX、JDOM和DOM4J。 1. DOM(文档对象模型)是W3C推荐的标准,它将XML文档转换为一棵树形结构,允许开发者通过节点遍历和操作XML内容。DOM的优势在于它提供了一种灵活的...

    ios 简单xml解析DEMO绝对可用

    本教程将介绍如何在iOS应用中实现简单的XML解析,并提供了一个名为"UITableViewTricks"的DEMO,供开发者们参考学习。 XML文件结构清晰,易于理解,但在iOS中解析XML数据并非内置功能,需要借助第三方库或者Apple...

    MusicXML 解析与布局

    MusicXML是一种开放标准的音乐符号交换格式,它允许数字音乐...总之,"MusicXML解析与布局"项目涵盖了XML解析、数据结构设计、图形渲染、音乐理论等多个方面的知识,对于深入理解音乐和计算机科学的结合具有重要意义。

    XML解析工具

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,...

    适合嵌入式系统的开源XML解析器

    在嵌入式系统中,由于资源限制,往往需要轻量级且高效的XML解析器。"minixml"就是这样一个专为嵌入式系统设计的开源XML解析器,它提供DOM(Document Object Model)支持,使得开发者能够方便地处理XML文档。 mini...

    java心电图xml解析.zip

    Java XML解析是Java开发中的一项重要技能,尤其是在处理结构化数据时。XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于配置文件、数据交换和文档存储等领域。本压缩包“java心电图xml解析....

    XML解析支持库

    XML解析支持库则是用于处理XML文档的核心工具,它们帮助开发者有效地读取、解析、创建和操作XML数据。 在Java开发中,常见的XML解析库有DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming...

    xml解析器,xml解析代码例子

    本文将深入探讨XML解析器的工作原理,并通过具体的代码示例帮助你理解和掌握XML解析的基本方法。 XML文档结构由元素、属性、文本内容、注释等构成。元素是XML文档的核心,它们用尖括号包围,如 `&lt;element&gt;`。属性...

    libxml2-2.9.8.rar_C语言解析XML_ITW_c语言XML解析器_joined4mf_windows 8

    《C语言实现的libxml2-2.9.8 XML解析器详解》 XML(Extensible Markup Language)是一种用于标记数据的语言,广泛应用于网络数据交换、配置文件存储等领域。在IT行业中,C语言由于其高效、灵活的特点,常被用来编写...

    XML解析技术研究XML解析技术研究

    XML解析技术是XML应用的核心,它涉及将XML文档转换为可处理的结构化数据。XML,全称为eXtensible Markup Language,是一种元语言,用于描述结构化数据,独立于编程语言、操作系统和传输协议。W3C联盟自1996年开始...

    XML解析器,用于解析XML文件

    理解和熟练使用XML解析器是任何IT专业人士的必备技能之一,无论是在移动应用、Web服务还是桌面应用程序中,XML解析都发挥着关键作用。了解和掌握TinyXML这样的解析库,可以帮助开发者更高效地处理XML数据。

    XML解析器下载JAR包

    XML解析器是处理XML文档的核心组件,它能够读取XML文件并将其内容转换为程序可以理解的形式。在Java环境中,XML解析器通常以JAR(Java Archive)文件的形式提供,方便开发者集成到项目中。 "XML解析器下载JAR包"这...

    java XML解析方式实现自动生成word文档

    XML解析方式是一种高效且灵活的方法,能够帮助我们实现这一目标。本篇文章将详细探讨如何利用Java和XML解析来自动化创建Word文档。 首先,我们需要了解XML的结构。XML(Extensible Markup Language)是一种标记语言...

    基于XML解析技术的Visio图与应用程序间的数据交互

    4. XML解析技术在Visio图数据交互中的具体应用:本文提出了一种新的方法,它利用成熟的XML解析技术来实现Visio图与应用程序间的数据交互。首先,需要将Visio图转换成XML格式的.vdx文件;其次,设计并实现一个解析...

Global site tag (gtag.js) - Google Analytics