XML文档类型定义(DTD)与实际应用解析
立即解锁
发布时间: 2025-08-18 00:08:32 阅读量: 3 订阅数: 9 

### XML文档类型定义(DTD)与实际应用解析
#### 1. DOM相关方法
在处理XML文档时,我们经常会用到一些DOM(Document Object Model)相关的方法,以下是一些常见方法的介绍:
| 方法 | 描述 |
| --- | --- |
| `String getData()` | 返回节点中存储的文本。 |
| `int getLength()` | 返回列表或映射中节点的数量。 |
| `Node item(int index)` | 返回指定索引的节点,索引范围是0到`getLength() - 1`。 |
#### 2. 文档类型定义(DTD)的重要性
在遍历DOM文档的树结构时,如果不使用DTD,会面临大量繁琐的编程和错误检查工作。例如,当读取如下`font`元素时:
```xml
<font>
<name>Helvetica</name>
<size>36</size>
</font>
```
我们需要检查子节点的标签名、子节点类型等。而使用DTD可以让XML解析器自动验证文档结构,从而简化解析过程。
#### 3. DTD的规则与表示
DTD包含规则,用于指定文档的结构,例如`<!ELEMENT font (name,size)>`表示`font`元素必须有两个子元素`name`和`size`。以下是DTD中元素内容规则的表格:
| 规则 | 含义 |
| --- | --- |
| `E*` | E出现0次或多次 |
| `E+` | E出现1次或多次 |
| `E?` | E出现0次或1次 |
| `E1|E2| ... |En` | E1、E2、… 、En中的一个 |
| `E1, E2, ... , En` | E1之后依次是E2、… 、En |
| `#PCDATA` | 文本 |
| `(#PCDATA|E1|E2| ... |En)*` | 文本和E1、E2、… 、En的任意组合,出现0次或多次(混合内容) |
| `ANY` | 允许任何子元素 |
| `EMPTY` | 不允许有子元素 |
#### 4. DTD的指定方法
有几种方法可以指定DTD:
- **内部包含**:在XML文档中包含DTD,如下所示:
```xml
<?xml version="1.0"?>
<!DOCTYPE configuration [
<!ELEMENT configuration ...>
更多规则
...
]>
<configuration>
...
</configuration>
```
- **外部引用**:使用`SYSTEM`声明指定包含DTD的URL,例如:
```xml
<!DOCTYPE configuration SYSTEM "config.dtd">
```
- **公共标识符**:使用`PUBLIC`声明引用“知名”的DTD,例如:
```xml
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
```
#### 5. DTD规则的限制与注意事项
在DTD中,当元素可以包含文本时,规则有一定限制。例如,不能表达`size`元素的文本应该是整数,这可以通过XML Schema Definition(XSD)来更精确地指定。同时,一些复杂的正则表达式可能导致“非确定性”解析,例如`((x,y)|(x,z))`,需要改写为`(x,(y|z))`。
#### 6. 元素属性规则
除了元素内容规则,DTD还可以指定元素的合法属性。一般语法是`<!ATTLIST element attribute type default>`,以下是属性类型和默认值的表格:
| 属性类型 | 含义 |
| --- | --- |
| `CDATA` | 任意字符串 |
| `(A1|A2| ... |An)` | A1、A2、… 、An中的一个 |
| `NMTOKEN, NMTOKENS` | 一个或多个名称令牌 |
| `ID` | 唯一ID |
| `IDREF, IDREFS` | 一个或多个对唯一ID的引用 |
| `ENTITY, ENTITIES` | 一个或多个未解析的实体 |
| 属性默认值 | 含义 |
| --- | --- |
| `#REQUIRED` | 属性是必需的 |
| `#IMPLIED` | 属性是可选的 |
| `A` | 属性是可选的,如果未指定,解析器报告为A |
| `#FIXED A` | 属性要么未指定,要么为A,解析器都报告为A |
#### 7. 实体定义与使用
DTD还可以定义实体,在解析时替换实体引用。例如:
```xml
<!ENTITY back.label "Back">
<menuitem label="&back.label;"/>
```
解析器会将`&back.label;`替换为`Back`。
#### 8. 配置解析器使用DTD
为了利用DTD的优势,我们需要配置解析器。以下是具体步骤:
1. 开启验证:
```java
factory.setValidating(true);
```
2. 忽略元素内容中的空白:
```java
factory.setIgnoringElementContentWhitespace(true);
```
#### 9. 错误处理
当解析器报告错误时,我们需要安装错误处理程序。实现`ErrorHandler`界面,并设置错误处理程序:
```java
class MyErrorHandler implements ErrorHandler {
public void fatalError(SAXParseException exception) {
// 处理致命错误
}
public void error(SAXParseException exception) {
// 处理非致命错误
}
public void warning(SAXParseException exception) {
// 处理警告
}
}
builder.setErrorHandler(new MyErrorHandler());
```
#### 10. 实际应用:使用XML描述网格袋布局
在实际应用中,我们可以使用XML来描述Swing组件的网格袋布局。网格袋布局由行和列组成,类似于HTML表格:
```xml
<gridbag>
<row>
<cell>...</cell>
<cell>...</cell>
...
</row>
<row>
<cell>...</cell>
<cell>...</cell>
...
</row>
...
</gridbag>
```
`gridbag.dtd`指定了这些规则:
```xml
<!ELEMENT gridbag (row)*>
<!ELEMENT row (cell)*>
```
单元格可以跨多行和多列,通过设置`gridwidth`和`gridheight`属性实现。以下是单元格属性的DTD规则示例:
```xml
<!ATTLIST cell gridwidth CDATA "1">
<!ATTLIST cell gridheight CDATA "1">
<!ATTLIST cell fill (NONE|BOTH|HORIZONTAL|VERTICAL) "NONE">
<!ATTLIST cell anchor (CENTER|NORTH|NORTHEAST|EAST
|SOUTHEAST|SOUTH|SOUTHWEST|WEST|NORTHWEST) "CENTER">
<!ATTLIST cell ipadx CDATA "0">
<!ATTLIST cell ipady CDATA "0">
<!ATTLIST cell weightx CDATA "100">
<!ATTLIST cell weighty CDATA "100">
<!ATTLIST cell gridx CDATA #IMPLIED>
<!ATTLIST cell gridy CDATA #IMPLIED>
```
#### 11. 解析网格袋布局文件
以下是解析网格袋布局文件的主要步骤:
1. 创建`GridBagPane`类,设置布局和约束:
```jav
```
0
0
复制全文
相关推荐










