XML学习手册

基础语法

声明

  • version
  • encoding:默认是 UTF-8
  • 如果 encoding=”GB2312”,就可以在其中使用简体中文。还有 ISO-8858-1
  • 注释用 来包含。不能放在第一项,因为声明必须第一行,不能放在任何一个标记中

形式良好的 XML 文档

  • 对大小写敏感
  • 必须有根元素
  • 属性值必须加引号
  • 不可以加特殊字符,需要引用
  • 会保留空格

命名规则

元素

  • 字母数字和其他
  • 不能以数字或者标点开始
  • 不能以 xml(各种大小写)开始
  • 名称不能包含空格

最佳
比较短;
避免:- . :等,用下划线

属性

尽量避免使用属性,与数据有关的都用元素来描述,属性来提供与数据无关的信息。

元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。

xml 验证

拥有正确语法的 XML 被称为“形式良好”的 XML。

通过 DTD 验证的 XML 是“合法”的 XML。

XML DTD(Document Type Definition)

XML 使用 DTD 来描述数据

1
2
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE note SYSTEM "Note.dtd">

XML Schema

W3C 支持一种基于 XML 的 DTD 代替者,它名为 XML Schema:

显示

我们可以采用 CSS 和 XSLT 来显示 XML,一般提倡 XSLT

1
2
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="simple.xsl"?>

命名空间

当发生冲突的时候,我们可以采用两种方式解决

使用前缀来避免命名冲突

1
2
3
4
5
6
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>

使用命名空间(Namespaces)

    xmlns:namespace-prefix="namespaceURI"

与仅仅使用前缀不同,我们为

标签添加了一个 xmlns 属性,这样就为前缀赋予了一个与某个命名空间相关联的限定名称。

1
2
3
4
5
6
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>

默认的命名空间

    xmlns="namespaceURI"
1
2
3
4
5
6
<table xmlns="http://www.w3.org/TR/html4/">
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>

XML CDATA 忽略解析

PCDATA 指的是被解析的字符数据(Parsed Character Data)。

XML 解析器通常会解析 XML 文档中所有的文本。

非法的 XML 字符必须被替换为实体引用(entity reference)。
术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。

在 XML 元素中,”<” 和 “&” 是非法的。

“<” 会产生错误,因为解析器会把该字符解释为新元素的开始。

“&” 也会产生错误,因为解析器会把该字符解释为字符实体的开始。

某些文本,比如 JavaScript 代码,包含大量 “<” 或 “&” 字符。为了避免错误,可以将脚本代码定义为 CDATA。

CDATA 部分中的所有内容都会被解析器忽略。

CDATA 部分由 结束:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1;
}
else
{
return 0;
}
}
]]>
</script>

关于 CDATA 部分的注释:

  • CDATA 部分不能包含字符串 “]]>”。也不允许嵌套的 CDATA 部分。
  • 标记 CDATA 部分结尾的 “]]>” 不能包含空格或折行。

XSL(Extensible Stylesheet Language)显示 XSL

XSLT 是一种用来转换 XML 文档结构的语言,一个 XSL 文件本身就是一个 XML 文档。

XSL 包含三部分:

XSLT——转换 XML 文档
XPath——浏览定位 XML 文档
XSL-FO——格式化 XML 文档

CSS 与 XSL

CSS 很多缺点:不能重排序,不能判断哪个元素显示;不能统计计算元素中的数据

技术难题

  • 从源 XML 文档读取信息:
    XPath:定位
    XSLT:定位之后读取
  • 目标 XML 写入信息
    XSLT 元素

模板驱动模型

XSL 提供了一种归并功能。XSL 样式表包含了一个描述结果结构的模板。

XPath

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<root>
<item>
<title></title>
<definition><title></title></definition>
</item>
<item>
<title></title>
<definition><title></title></definition>
</item>
<item version="9.9">
<title></title>
<definition><title></title></definition>
</item>
</root>

/root/item[position()=1](第一个 title)
/root/item/definition/title(第二个 title)
/root/item(全部 item)
./@version(选择属性节点)

XSLT

  • 有 37 个元素

  • 本身是一个 xml 文件

  • 在源 xml 文件中引用样式表

      <?xml-stylesheet type="text/xsl href="URI""?>
    

声明

从根元素开始

  • <xsl:stylesheet version=”1.0” xmlns:xsl=”URI”> 表明这是一个样式表文件,URI 提供了定义的命名空间
  • <xsl:output encoding=””>指定输出的 HTML 使用的编码
  • <xsl:template match=”/“>指明了根

Java 处理 XML

SAX,DOM 是解析器所采用的两种重要的解析 API

DOM(文档对象模型)

用于描述节点与节点之间的关系
较好的随机访问性能
平台无关
基于树的整颗对象树,建立在内存中

  • 创建 DocumentBuilderFactory,用该对象创建 DocumentBuilder。
  • 创建 DocumentBuilder。用它来解析得到 Document 对象。
  • 解析文件以创建 Document 对象。

SAX(Simple API for XML)

顺序遍历文档,然后产生所有节点事件,在内存中只保留当前处理部分。

适用

大数据量有优势
在文档中检索一个特定的值
创建文档子集,以便后继 DOM 处理

基于事件的机制

优点
与 xml 文件大小无关;不需要等到文档解析结束,就可以开始处理

缺点
不允许随机访问,比 DOM 复杂,不可能对数据进行更改,或者返回数据流之前的数据

两个可以结合使用