XML技术全面解析与应用实践
立即解锁
发布时间: 2025-08-18 02:37:48 阅读量: 3 订阅数: 11 

### XML技术全面解析与应用实践
#### 1. XML简介
XML(可扩展标记语言)是一种可移植、人类可读的格式,用于在程序之间交换文本或数据。它源自SGML标准,和全球网页使用的HTML语言有共同的“祖先”,可以说是HTML更年轻、功能更强大的“兄弟”。由于大多数开发者对HTML有一定了解,因此在讨论XML时,常将其与HTML进行比较。XML鲜为人知的“祖父”是IBM的GML(通用标记语言),“表亲”之一是Adobe FrameMaker的Maker Interchange Format(MIF)。其家族树如下:
```mermaid
graph LR
GML --> SGML
SGML --> HTML
SGML --> XML
SGML --> MIF
```
从某种角度看,XML是经过清理和整合的HTML,并且允许用户自定义标签。它的标签更侧重于标识信息内容,而非格式。XML也可作为一种通用的交换格式,用于互联网上的企业对企业通信,或者作为对各种事物(如文字处理文件和Java文档)的人类可编辑描述。
由于XML被广泛接受,它成为了许多其他格式的基础,包括Open Office的保存文件格式、SVG图形文件格式等。
从SGML继承而来,HTML和XML都使用尖括号(< 和 >)围绕标签的语法,每对标签界定XML文档的一个部分,称为元素。元素可以包含内容(如HTML中的<P>标签),也可以不包含(如HTML中的<hr>)。HTML文档可以以<html>标签或<DOCTYPE...>标签开头(非正式情况下也可以都不用),而XML文件可以以XML声明开头。如果文件的字符编码不是UTF - 8或UTF - 16,则必须以XML处理指令(<? ... ?>)开头,例如:
```xml
<?xml version="1.0" encoding="iso-8859-1"?>
```
其中问号是用于标识XML声明的特殊字符,在语法上类似于ASP和JSP中使用的%。
HTML有许多接受属性的元素,例如:
```html
<BODY BGCOLOR=white> ... </body>
```
在XML中,属性值(如处理指令中的版本号1.0或BGCOLOR的white)必须加引号。也就是说,在HTML中引号是可选的,但在XML中是必需的。上述的BODY示例在传统HTML中允许,但会被任何XML解析器拒绝。XML区分大小写,在XML中,BODY、Body和body代表三个不同的元素名称。每个XML开始标签必须有匹配的结束标签,这是XML规范中详细列出的基本约束之一。任何满足所有这些约束的XML文件都被认为是格式良好的,并且可以被XML解析器接受;格式不正确的文档将被XML解析器拒绝。
#### 2. XML解析器与API
有各种各样的XML解析器可供使用。解析器是一种读取XML文件、至少从语法上检查它,并允许访问部分或全部元素的程序或类。大多数解析器符合两种著名的XML API(SAX和DOM)的Java绑定。
- **SAX(Simple API for XML)**:简单的XML API,读取文件并在遇到某些事件(如元素开始、元素结束、文档开始等)时调用用户代码。
- **DOM(Document Object Model)**:文档对象模型,读取文件并构建一个与文件中元素及其属性和内容相对应的内存树或图。这个树可以被遍历、搜索、修改(甚至可以使用DOM从头构建)或写入文件。
此外,还有一个名为JDOM的替代API已发布到开源领域。JDOM由Brett McLaughlin和Jason Hunter开发,主要针对Java,而DOM本身设计用于与多种不同的编程语言一起工作。JDOM可从http://www.jdom.org获取,并已被接受为Sun社区标准流程的JSR(Java Standards Request)。
解析器如何知道XML文件是否包含正确的元素呢?较简单的“非验证”解析器只关注文档的格式是否良好,而验证解析器会检查XML文件是否符合给定的文档类型定义(DTD)或XML模式。DTD继承自SGML,其语法将在后续讨论;模式比DTD更新,虽然更复杂,但提供了基于对象的特性,如继承。DTD使用从SGML派生的特殊语法编写,而XML模式使用普通的XML元素和属性表示。
#### 3. 生成XML
如果想直接从Java对象生成XML,可以使用XML对象序列化器。以下是一个示例代码:
```java
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.*;
/** Show the XML serialization added to "java.beans.*" in JDK1.4.
* Subclass "SerialDemoAbstractBase" to get most of the infrastructure
*/
public class SerialDemoXML extends SerialDemoAbstractBase {
public static final String FILENAME = "serial.xml";
public static void main(String[] args) throws IOException {
new SerialDemoXML().save();
new SerialDemoXML().dump();
}
/** Save the data to disk. */
public void write(Object theGraph) throws IOException {
XMLEncoder os = new XMLEncoder( // NEEDS JDK 1.4
new BufferedOutputStream(
new FileOutputStream(FILENAME)));
os.writeObject(theGraph);
os.close();
}
/** Display the data */
public void dump() throws IOException {
XMLDecoder inp = new XMLDecoder( // NEEDS JDK 1.4
new BufferedInputStream(
new FileInputStream(FILENAME)));
System.out.println(inp.readObject());
inp.close();
}
}
```
操作步骤如下:
1. 创建一个继承自`SerialDemoAbstractBase`的`SerialDemoXML`类。
2. 在`main`方法中调用`save`和`dump`方法。
3. `write`方法使用`XMLEncoder`将对象写入文件。
4. `dump`方法使用`XMLDecoder`从文件中读取对象并打印。
#### 4. 使用XSLT转换XML
当需要对输出格式进行重大更改时,可以使用XSLT(Extensible Stylesheet Language for Transformations)。XSLT允许对输出格式进行大量控制,可用于将XML文件从一种词汇表转换为另一种,也可将XML渲染为其他格式,如HTML。一些开源项目甚至使用XSLT从XML描述生成Java源文件。
下面的示例使用XSLT将包含人员姓名、地址等信息的文件(如`people.xml`)转换为可打印的HTML。
`people.xml`文件内容如下:
```xml
<?xml version="1.0"?>
<people>
<person>
<name>Ian Darwin</name>
<email>http://www.darwinsys.com/contact.html</email>
<country>Canada</country>
</person>
<person>
<name>Another Darwin</name>
<email type="intranet">afd@node1</email>
<country>Canada</country>
</person>
</people>
```
`people.xsl`文件内容如下:
```xml
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html>
<head><title>Our People</title></head>
<body>
<table border="1">
<tr>
<th>Name</th>
<th>EMail</th>
</tr>
<xsl:for-each select="people/person">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="email"/></td>
</tr>
</xsl:for-each>
</table>
</body></html>
</xsl:template>
</xsl:stylesheet>
```
使用以下命令将`people.xml`文件转换为HTML:
```sh
$ java JAXPTransform people.xml people.xsl people.html
```
`JAXPTransform.java`代码如下:
```java
import java.io.File;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
/** Illustrate simple use of JAXP to transform using XSL */
public class JAXPTransform {
public static void main(String[] args) throws Exception {
if (args.length != 3) {
System.out.println(
"Usage: java JAXPTransform inputFile.xml inputFile.xsl outputFile");
System.exit(1);
}
// Create a transformer object
Transformer tx = TransformerFactory.newInstance().newTransformer(
new StreamSource(new File(args[1]))); // not 0
// Use its transform( ) method to perform the transformation
tx.transform(
new StreamSource(new File(args[0])),
new StreamResult(new File(args[2])));
}
}
```
操作步骤如下:
1. 准备好`people.xml`和`people.xsl`文件。
2. 运行`JAXPTransform`程序,传入输入的XML文件、XSL文件和输出的HTML文件作为参数。
3. 程序将使用XSLT处理器将XML文件转换为HTML文件。
#### 5. 使用SAX解析XML
如果想快速浏览XML文件并提取某些标签或其他信息,可以使用SAX创建文档处理程序并将其传递给SAX解析器。
XML的DocumentHandler接口指定了一些回调方法,代码必须提供这些方法。最常用的方法是`startElement()`、`endElement()`和`characters()`。前两个方法分别在元素开始和结束时调用,`characters()`方法在有字符数据时调用。
以下是一个使用SAX从XML文件中提取姓名和电子邮件地址的简单程序:
```java
impo
```
0
0
复制全文
相关推荐










