java中xml及其解析技术DOM4J框架

javaXML 专栏收录该内容
1 篇文章 0 订阅

xml (可扩展标记语言)  全称: Extended Markup Language
可扩展的含义:允许程序员按照自己的想法去扩展新的标签
但是扩展的时候,必须要遵循XML规范

xml的特点
自带描述性,
可以支持跨平台,
保留了面向对象编程的层次感

 

编写xml的语法

  1. 头,也被称之为序言  包含了(文档声明 注释 空白)
  2. 文档元素 包含了(注释,空白,标签,内容,标签描述)

 

Xml的文档声明:

<?xml version="1.0" encoding="UTE-8" standalone="yes"?>

version="1.0" 表示版本信息,当前版本信息默认1.0,不需要修改

encoding="UTE-8" 表示使用编码集,这里采用utf-8编码集

standalone="yes"  表示后面的内容是否都是属于本文档的,yes表示后面内容全部来自于本文档,no表示不全来自本文档

注意:文档声明顺序不能改变,不然会报错,另外xml严格区分大小写

 

xml的注释

语法:<!-- 注释的内容 -->

  1. 注释不能放到xml的声明之前,

如错误写法:

<!-- 下面是文档声明 -->
<?xml version="1.0" encoding="UTE-8" standalone="yes"?>

     2、注释需要严格遵循注释的语法,不能写成<-- -->、<!- -->、<!-- ->

     3、注释不要放到标签中间去了,容易混淆

     4、一定不要在一个注释中有多个开始和结束( 也就是多个<!-- 和 --> )

注释的作用:告诉xml解析器,不要解析被注释的内容

 

空白的作用:

在xml中,可以使用空格,制表符,回车等方式,让文档看起来更直观

 

xml的文档元素

语法:<开始标签>内容...</结束标签>

元素可以是整个文档中,最基本的数据存储单位,或者说最基本的逻辑单位

定义标签时 需要遵循一下规范:

  1. 标签名的定义,可以使用中文、英文、数字、下划线,但是名称必须使用字母或下划线或中文开始(建议不要使用:中文),数字一定不能作为开始
  2. 每一个xml文档中,必须要有一个根标签,但是在根标签内部,可以扩展非常多的子标签
  3. 每一个xml文档中,至少需要存在一个标签元素,否则虽然不会报错,但没有任何意义啊
  4. 定义标签时,一定不要在名称中使用空格、冒号、感叹号等等其他符号
  5. 一定不要再名称中间包含xml(XML)或者xml. 或者 .xml 等内容

元素内容:

  1. 字符数据 所有的:中英文、数字、各种符号(但是要注意:< > &   )
  2. 嵌套标签元素,例如:
<wife>
<userName>小刘</userName>
<age>18</age>
</wife>

     3、实体(所谓实体,就是指 < > &   的替代)

字符名称

字符

实体引用

&

&

大于号

>

小于号

<

单引号

'

双引号

"

    4、静态语句块

语法:  <![CDATA[ 静态语句内容 ]]>

静态语句块作用:告诉xml解析器,我内部的内容,没有什么持殊的含义,就是一个普通的字符串

如:<![CDATA[ < > &   ]]>

 

元素还可以添加属性:

属性的作用:进一步描述或者修饰该元素

定义属姓名称的时候,也需要遵循一定的规则:

1、属性名称可以包含字母、下划线、中文(但是不推荐中文)  名称中不能有空格,也一定不在名称中使用空格冒号、感叹号等等的其他符号-
2、在同一个元素中,属性名不能重复
3、属性名区分大小写

4、定义标属性名时,一定不在名称中包含xml (XML)或者xml. 或者 .xml 等内容

5、属性定义的方式,采用k=v键值对的方式进行定义,例如:type=string值必须包含在“内,而且”必须成对出现

 

(DTD (Document Type Definition)     Schema)规范XML

 

XML的解析技术DOM/SAX  ----完成OXM   object-XML-Mapping

1、DOM文档对象模型,采用树形结构来完成对文档的解析,它在解析时,会将整个文档加载内存中,然后形成"节点数",当文档内容过多,或者需要解析的文档过多,会造成服务器内存紧张。

 

2、SAX基于事件驱动模式下的文档解析技术,在识别不同的XML语法结构时,SAX解析器使用回调机制来通知客户端应用程序,而不是将整个文档都存储在内存中。即使是处理大型文档也不会占用大量内存。

具有SAX的XML处理器并不创建数据结构,而是扫描输入XML文档,并生成元素开始、元素结束等事件,在发生事件时,解析器会通知应用程序。

由于SAX不创建显式数据结构,因此它比DOM的效率更高。

 

 

DOM4J框架,提供了一套完整的针对DOM和SAX的解析技术,目前使用较为广泛

  • DOM4J:Dom4j是一个易用的、开源的库,用于XML、XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM、SAX和JAXP。在Java开发社区里,DOM4J的使用最为广泛。JDOM的操作非常简单,但是在处理大XML文件时性能表现不佳,解析10M文档时就会内存溢出。而DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和易于使用的特点,同时它也是一个开放源代码的软件,DOM4J使用大量的接口,这也是它被认为比JDOM灵活的原因。如今我们可以看到越来越多的Java软件都在使用DOM4J来读写XML。DOM4J的官方地址是“http://www.dom4j.org/”。

由于在实际项目开发中,采用DOM4J的占主流,所以讲解DOM4J的使用。

在org.dom4j包中定义了DOM4J使用的主要接口,表1显示了DOM4J这些接口。

表1 DOM4J的主要接口

接口

说明

Attribute

定义了XML的属性

CDATA

定义了XML CDATA 区域

CharacterData

标识基于字符的节点。如CDATA,Comment, Text.

Comment

定义了XML注释的行为

Document

定义了XML文档

DocumentType

定义XML DOCTYPE声明

Element

定义XML 元素

ElementHandler

定义了 Element 对象的处理器

Node

为所有的dom4j中XML节点定义了多态行为

ProcessingInstruction

定义 XML 处理指令

Text

定义XML 文本节点

XPath

在分析一个字符串后会提供一个XPath 表达式

1)利用DOM4J创建XML

本节将使用dom4j API创建 XML 文档。使用 DocumentHelper 类创建一个文档实例。 DocumentHelper类是生成 XML文档节点的dom4j API工厂类。

Document document = DocumentHelper.createDocument();

使用 addElement() 方法创建根元素 catalog 。addElement() 用于向 XML 文档中增加元素,并添加注释“An XML catalog”。

Element catalogElement = document.addElement("catalog");
catalogElement.addComment("An XML catalog");

在catalog元素中使用 addProcessingInstruction() 方法增加一个XML处理指令。

catalogElement.addProcessingInstruction("target","text");

在catalog元素中使用addElement()方法增加book元素。使用addAttribute()方法向 book元素添加title和publisher属性。

Element bookElement =  catalogElement.addElement("book");
bookElement.addAttribute("title", "XML Zone");
bookElement.addAttribute("publisher", "Java developer");

向book元素里添加article子元素,为 article 元素增加 level 和 date 属性

Element articleElement=bookElement.addElement("article");
articleElement.addAttribute("level", "Intermediate");
articleElement.addAttribute("date", "8-2008");

向article元素中增加 title 元素,使用setText()方法设置article元素的文本。

Element titleElement=articleElement.addElement("title");
titleElement.setText("Java configuration with XML Schema");

在article元素中增加author元素在author元素中增加firstname元素和lastname元素并设置元素的文本。

Element authorElement=articleElement.addElement("author");
Element  firstNameElement=authorElement.addElement("firstname");
firstNameElement.setText("tiger");
Element lastNameElement=authorElement.addElement("lastname");
lastNameElement.setText("MM");

可以使用 addDocType() 方法添加文档类型说明。

document.addDocType("catalog", null,"file://d:/xmldtds/catalog.dtd"); 

这样就向 XML 文档中增加了文档类型说明:

<!DOCTYPE catalog SYSTEM "file://d:/xmldtds/catalog.dtd">

输出文档方式与JDOM很相似。

OutputFormat format = OutputFormat.createPrettyPrint()
XMLWriter output = new XMLWriter(System.out, format);
output.write( document);
output.close();

也可以输出到文件。

XMLWriter output = new XMLWriter(new FileWriter(new File("book.xml")), format);

输出格式类OutputFormat可以使用createPrettyPrint()方法设置缩减格式和createCompactFormat()设置紧凑格式。最终代码输出图2所示内容:

                                            图2 DOM4J创建XML文档

提示:使用DOM4J应该把dom4j.jar和jaxen.jar包放置在classpath下。

2)利用DOM4J修改XML

DOM4J的xPath表达式功能可以非常方便地查找并修改XML文件中元素的内容。首先使用下面的代码创建SAXReader解析对象

SAXReader saxReader = new SAXReader();
Document document = saxReader.read(inputFile);

“inputFile”就是需要读取的XML文件,可以是File对象、String对象或者InputStream对象。使用 XPath 表达式从 article元素中获得 level 节点列表,如果 level 属性值是“Intermediate”则改为“Introductory”。代码片段如下:

List list = document.selectNodes("//article/@level" );
Iterator iter=list.iterator();
while(iter.hasNext()){
 Attribute attribute=(Attribute)iter.next();
 if(attribute.getValue().equals("Intermediate")){
       attribute.setValue("Introductory");
 }

}

提示:表达式“//article/@level”指示找到article元素下的level属性。“//article/author”指示找到article元素下的author子元素。

还可以获取article元素列表,从article元素中的 title 子元素得到一个迭代器,并修改title元素的文本。

List list = document.selectNodes("//article" );
Iterator iter=list.iterator();
while(iter.hasNext()){
       Element element=(Element)iter.next();
       Iterator iterator=element.elementIterator("title");
       while(iterator.hasNext()){
           Element titleElement=(Element)iterator.next();
            if(titleElement.getText().equals("Java configuration with XML ")){
           titleElement.setText("Create flexible and extensible XML schema");
            }
     }
}

从上述代码可以看到DOM4J使用集合框架完成XML元素的遍历查找,使得开发变得非常方便,性能也显著提高。

 

以上内容总结如下:

  • 一个XML文档由两个部分组成:一个部分是序言,包括XML文档声明、注释、空白;另一个部分是文档元素,这两个部分是必须的。此外,我们还可以选择性地包含注释、处理指令和空白。
  • XML文档必须是格式良好的(Well-formed)。如果XML文档不是格式良好的,就不能被应用程序和浏览器正确识别和解析。
  • XML文档声明由“<?xml”开始,以“?>”结束。这个声明的作用在于告诉XML处理程序:该文档是按照XML文档规范对数据进行组织的。
  • XML文档注释以“<!--”开始,以“-->”结束。在XML文档被XML处理程序解析时,这些注释内容会全部被忽略不显示.
  • 处理指令(Processing Instruction)被用来为XML处理程序提供信息,以“<?处理指令名称 处理指令信息?>”的格式呈现,通常它用来传递信息给解析器的下游程序。
  • XML空白是指由一个或者更多的空格符、制表符、回车符、换行符等组成的字符或者字符串。
  • 一个XML元素通常这样组成:一个开始标记,然后是元素内容,最后是结束标记。
  • XML元素内容可以是字符数据、嵌套的元素、实体引用、CDATA。
  • XML技术体系包括: 文档描述与校验技术(DTD/Schema)、文档转换技术(XSLT/XSL)、文档查询技术(XPath/XQuery)、 文档解析技术(DOM/SAX)、文档链接技术(XLink/XPointer)。
  • XML在语法结构上的优越性,使得它可以广泛地应用于信息表现、信息交换、信息存储、电子商务、网络出版和移动通讯等多个领域。
  • 解析是读取文档并将文档分解为能够进行分析的元素的过程。
  • XML处理器更常用的名称是解析器,这是因为它只解析XML和为应用程序提供所需的信息。
  • XML解析器有两种可用形式:进行验证的解析器和不进行验证的解析器。
  • XML解析器使用的两种基本API为DOM和SAX。
  • DOM表示文档对象模型。它定义了一组接口,用于创建、访问和操纵XML及HTML文档的内部结构。
  • SAX提供一种用于解析XML文档的事件驱动模型。在识别不同的XML语法结构时,SAX解析器使用回调机制来通知客户端应用程序。
  • 最常使用SAX解析器是JAXP,包括SAX和DOM的Java接口以及Java XML解析器必须实现的基本接口和类。
  • JDOM有效地把SAX和DOM的功能结合起来。
  • JDOM 对象就是像 Document、Element 和 Attribute 这些类的直接实例。
  • Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。
  • Dom4j应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
  • DOM4J使用大量的接口,因此它被认为比JDOM灵活,性能也比JDOM好。

 

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页

打赏作者

IT_CREATE

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值