java中xml及其解析技术DOM4J框架
xml (可扩展标记语言) 全称: Extended Markup Language
可扩展的含义:允许程序员按照自己的想法去扩展新的标签
但是扩展的时候,必须要遵循XML规范
xml的特点:
自带描述性,
可以支持跨平台,
保留了面向对象编程的层次感
编写xml的语法
- 头,也被称之为序言 包含了(文档声明 注释 空白)
- 文档元素 包含了(注释,空白,标签,内容,标签描述)
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的注释
语法:<!-- 注释的内容 -->
- 注释不能放到xml的声明之前,
如错误写法:
<!-- 下面是文档声明 -->
<?xml version="1.0" encoding="UTE-8" standalone="yes"?>
2、注释需要严格遵循注释的语法,不能写成<-- -->、<!- -->、<!-- ->
3、注释不要放到标签中间去了,容易混淆
4、一定不要在一个注释中有多个开始和结束( 也就是多个<!-- 和 --> )
注释的作用:告诉xml解析器,不要解析被注释的内容
空白的作用:
在xml中,可以使用空格,制表符,回车等方式,让文档看起来更直观
xml的文档元素
语法:<开始标签>内容...</结束标签>
元素可以是整个文档中,最基本的数据存储单位,或者说最基本的逻辑单位
定义标签时 需要遵循一下规范:
- 标签名的定义,可以使用中文、英文、数字、下划线,但是名称必须使用字母或下划线或中文开始(建议不要使用:中文),数字一定不能作为开始
- 每一个xml文档中,必须要有一个根标签,但是在根标签内部,可以扩展非常多的子标签
- 每一个xml文档中,至少需要存在一个标签元素,否则虽然不会报错,但没有任何意义啊
- 定义标签时,一定不要在名称中使用空格、冒号、感叹号等等其他符号
- 一定不要再名称中间包含xml(XML)或者xml. 或者 .xml 等内容
元素内容:
- 字符数据 所有的:中英文、数字、各种符号(但是要注意:< > & “ ‘ )
- 嵌套标签元素,例如:
<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 表达式 |
本节将使用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下。
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好。