XML数据的进阶应用:超越元素与属性
立即解锁
发布时间: 2025-08-17 01:32:34 阅读量: 1 订阅数: 6 

### XML数据的进阶应用:超越元素与属性
#### 1. 引言
在处理XML数据时,我们不能仅仅局限于元素和属性。以一个现有的示例文档为例:
```xml
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE airlocksystem SYSTEM "airlocks.dtd">
<airlocksystem>
<airlock lockid="A23b">
<size height="320" width="500" />
<type>Bronson</type>
<location>Level 2 aft</location>
<status>open</status>
<maintenance responsible="M83">
<lastdone>2/23/2325</lastdone>
<frequency>Once per month</frequency>
</maintenance>
</airlock>
<airlock lockid="Q36d">
<size height="200" width="300" />
<type>Perch</type>
<location>Level 15 starboard</location>
<status>closed</status>
<maintenance responsible="D59">
<lastdone>2/17/2325</lastdone>
<frequency>Once per month</frequency>
</maintenance>
</airlock>
<personnel badge="M83">
<name>Frank Madison</name>
<department>Maintenance</department>
</personnel>
<personnel badge="D59">
<name>Angus Doyle</name>
<department>Maintenance</department>
</personnel>
</airlocksystem>
```
这个文件是气闸控制系统的基础,但我们可以通过使用XML文件中除元素和属性之外的信息项,让它发挥更多作用。
#### 2. 实体(Entities)
当我们需要在XML文件中添加类似标记的信息时,会遇到问题。例如,想要添加气闸标志的引用:
```xml
<signage><DANGER!> Open Airlock</signage>
```
此时文档不再格式良好,因为应用程序会认为`DANGER!`是标记,从而寻找结束标签。
幸运的是,XML允许我们使用`&`和`;`来“转义”字符。在HTML页面中我们有时会看到这种情况,例如下面的HTML页面展示气闸标志:
```html
<html>
<head>
<title>Signage</title>
</head>
<body>
<p>Signage for airlock A23b:</p>
<p><DANGER!> Open Airlock</p>
</body>
</html>
```
浏览器会将`<`和`>`转换回`<`和`>`符号。
这些转义值称为实体。XML定义了五个可以自动使用的实体,如下表所示:
| 实体 | 结果符号 | 描述 |
| ---- | ---- | ---- |
| `<` | `<` | 小于号 |
| `>` | `>` | 大于号 |
| `&` | `&` | 和号 |
| `"` | `"` | 引号 |
| `'` | `'` | 撇号(单引号) |
这些实体允许我们进行更全面的表达:
- `<`和`>`实体允许我们在元素或属性中添加看似标记的信息。
- `'`和`"`允许我们在属性值中添加单引号和双引号,而不会过早终止属性。
- `&`允许我们使用和号,而不会让应用程序认为我们在尝试创建转义字符。
此外,我们还可以定义自己的实体,这对于难以输入的字符或需要在多个地方使用的整段文本很有用。
#### 3. CDATA部分
有时,即使转义字符也不能解决问题,可能是需要转义的数据太多,或者转义后使用不方便。在将脚本作为文件的一部分添加到网页时,经常会遇到这种情况。
为了解决这个问题,我们可以使用CDATA部分。CDATA是字符数据的缩写,和属性值一样,CDATA部分不会被应用程序解析,因此我们可以在其中添加任何内容。
例如,我们可以这样解决前面标志的问题:
```xml
<signage><![CDATA[<DANGER!> Open Airlock]]></signage>
```
或者添加与数据相关的脚本,如下所示:
```xml
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE airlocksystem SYSTEM "airlocks.dtd">
<airlocksystem>
<airlock lockid="A23b">
<size height="320" width="500" />
<type>Bronson</type>
<location>Level 2 aft</location>
<status>open</status>
<maintenance responsible="M83">
<lastdone>2/23/2325</lastdone>
<frequency>Once per month</frequency>
</maintenance>
<signage>
<signtext><![CDATA[<DANGER> Open Airlock]]></signtext>
<checkscript type="text/javascript">
<![CDATA[
function checkSign() {
var now = new Date();
var targetDate = new Date("3/23/2325")
if (targetDate.valueOf() < now.valueOf(){
alertString = "DANGER! Airlock maintenance"
alertString = alertString + "is overdue!";
alert(alertString);
}
}
]]>
</checkscript>
</signage>
</airlock>
...
</airlocksystem>
```
CDATA部分允许我们添加必要的项,而不用担心影响内容的格式良好性。
#### 4. 处理指令(Processing Instructions)
另一种常见的添加到XML的信息类型是处理指令。处理指令包含传递给处理数据的应用程序的信息,通常包含目标和传递给目标的指令。例如:
```xml
<?environment checkAtmosphere?>
```
开头的`<?`告诉应用程序这是处理指令的开始,接着是目标,然后是指令。需要注意的是,XML声明虽然也以`<?`开头,以`?>`结尾,但它不被视为处理指令。
在大多数情况下,“指令”采用名值对的形式。目前最常见的处理指令形式是样式表指令。例如,我们可以向XML文件添加样式表:
```xml
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE airlocksystem SYSTEM "airlocks.dtd">
<?xml-stylesheet href="airlocks.xsl" type="text/xsl"?>
<airlocksystem>
<airlock lockid="A23b">
<size height="320" width="500" />
<type>Bronson</type>
...
```
当浏览器处理这个文件时,会看到处理指令,并知道将样式表应用于数据。
#### 5. 注释(Comments)
在编程中,注释是XML中最容易被忽视的信息类型。注释以`<!--`开头,以`-->`结尾,处理器会忽略它,因此它有两个作用:
- 为查看文件的人添加信息。
- 有效地“移除”文档的某些部分。
例如:
```xml
...
<airlock lockid="A23b">
<size height="320" width="500" />
<type>Bronson</type>
<location>Level 2 aft</location>
<status>open</status>
<maintenance responsible="M83">
<lastdone>2/23/2325</lastdone>
<frequency>Once per month</frequency>
</maintenance>
<signage>
<signtext><![CDATA[<DANGER> Open Airlock]]></signtext>
<!-- CheckScript currently under review. Removed until
review completion. NC 3/1/2325 -->
<checkscript type="text/javascript">
<!--
<![CDATA[
function checkSign() {
var now = new Date();
var targetDate = new Date("3/23/2325");
if (targetDate.valueOf() < now.valueOf()) {
alertString = "DANGER! Airlock maintenance"
alertString = alertString + "is overdue!";
alert(alertString);
}
}
]]>
-->
</checkscript>
</signage>
</airlock>
...
```
在这个例子中,我们添加了关于`CheckScript`状态的注释,并通过注释有效地移除了`checkscript`元素的内容。
#### 6. 格式良好与有效文档
在前面的讨论中,我们经常提到格式良好的文档,偶尔也会提到有效文档。这两个概念有很大的区别:
- 格式良好的文档满足基本XML文档的要求,但可以包含任意元素、任意顺序和任意类型的内容。
- 有效文档符合特定元素和属性的定义,包括它们的出现位置。
格式良好的文档不一定是有效文档,但所有有效文档必须格式良好。可以这样理解:一个盒子可以是矩形(有四条边),但不一定是正方形(四条边长度相等);但如果一个盒子是正方形,它一定是矩形。
#### 7. 有效文档
格式良好文档的一些要求只有在有文档类型定义(DTD)的文档上下文中才有意义。DTD是一种提供验证文档的标准的方法,它提供了文档可以包含的元素和属性的信息。
例如,下面是一个内部DTD以及构建的文档:
```xml
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE airlocksystem [
<!ELEMENT airlocksystem (airlock+,personnel+)>
<!ELEMENT airlock (size, type, location, status, maintenance, signage)>
<!ATTLIST airlock lockid CDATA #IMPLIED>
<!ELEMENT size (#PCDATA)>
<!ATTLIST size height CDATA #IMPLIED
```
0
0
复制全文
相关推荐










