xml概述
xml是一种能表示层次结构的标记语言,比属性文件的平面表结构更灵活,它与html较为类似
区别如下:
1.xml是大小写敏感的,如,
1 | <H1> |
和
1 | <h1> |
是不同的xml标签
2.在xml中,只有一个标签而无相应的尾标签的元素必须以/结尾,比如
1 | <img src="" /> |
,这样,解析器就不必查找
1 | </img> |
标签了。
3.在xml中,属性值必须用引号括起来,在html中,引号是可有可无的,如
1 | <applet code="" width=300 height=400> |
对html来说是合法的,但对xml来说不合法。
4.在html中属性可以没有值,如,
1 | <input type="radio" name="hhh" value="hhh" checked> |
,在xml中所有属性都必须有值。
xml文档的结构
xml应当以一个文档头开始,如:
1
文档头之后通常是文档类型定义,如:
1
最后xml文档的正文包含根元素,根元素包含一些其他的元素。如:
1
2
3
4
5
6
7
8
9
10
<configuration>
<title>
<font>
<name>Helvetica</name>
<size>36</size>
</font>
</title>
</configuration>元素可以有子元素、文本或者两者皆有(在设计xml文档时,最好使元素要么包含子元素,要么包含文本,应该避免以下情况:在xml规范中,这叫做混合式内容,避免了混合式内容可以简化简化解析过程。)
1
2
3
4<font>
Helvetica
<size>35</size>
</font>属性只应在修改值的解释时使用,而不是指定值时使用。
元素和文档是xml文档的“主要支撑要素”,以下是一些标记说明
字符引用的形式是&#十进制值,或者&#x十六进制值,如字符e可以用下面两种形式表示: é; Ù;
实体引用的形式是&name;。下面这些实体引用:<;>;&;";&apos;分别表示<,>,&,’,…等字符,可以在DTD中定义其他的实体引用。
CDATA部分用<![CDATA[和]]>来限定其界限。他们是字符数据的一种特殊形式。你可以使用它们来包含那些含有<,>,&之类字符的字符串,而不必将它们解释为标记,例如:
1 | <![CDATA[< & > are myfavourate delimiters]]> |
CDATA部分不能包含字符串]]>。使用这一特性时要特别注意。它常用来当做将传统数据偷偷纳入XML文档的一个后门。
- 处理指令(processing instruction)是那些专门在处理xml文档的应用程序中使用的指令,它们将用<?和?>来限定其界限,例如:
1 |
每个xml都以下面这个处理指令开头:
<?xml version=”1.0” encoding=”utf-8”?>
- 注释用<!– 和–!>来限定其界限:<!– 这是一个注释 –!>
解析xml文档
一、基于文档对象模型(DOM)的树形解析器
DOM解析器对于实现我们的大多数目的来说都很容易,不过用它生成树结构会消耗大量内存。JDK中自己包含的有DOM解析器,我们可以直接拿来用
下面的代码使用了DOM解析器解析了相关的xml文件:
1 | package domtree; |
1 |
|
二、基于xml简单API的(SAX)的流机制解析器(事件回调方式)
SAX解析器在解析XML输入的控件时就报告事件,但不会以任何方式存储文档。
在使用SAX解析器时,需要一个处理器来定义不同的解析器事件的事件动作。他们都实现了ContentHandler接口。ContentHandler接口定义了几个回调方法。最常用的如下
- startElement和endElement在每当遇到起始或终止标签是调用。
- characters每当遇到字符数据时调用。
- startDocument和endDocument分别在文档开始和结束时各调用一次。
例如解析以下片段时:
1 | <font> |
解析器会有以下调用:
- startElement,元素名:font
- startElement,元素名:name
- characters,内容:Helvetica
- endElement,元素名:name
- startElement,元素名:size,属性:units=“pt”
- characters,内容:36
- endElement,元素名:size
- endElement,元素名:font
示例程序如下:
1 | package saxtest; |