XML技术已成为当今互联网数据交互的重要手段之一,无论是Web服务、SOA(面向服务的架构)、数据交换、电子商务等领域都离不开XML技术的应用。其标准、开放、易扩展、可读性强等特点,使其广泛应用于各类系统间数据传输。那么,“掌握XML技术,打造高效数据交互”成为众多开发者必须掌握的技能之一。
一、XML简介
XML指的是可扩展标记语言,把文档分成数据与标签两部分。数据即内容,标签则描述数据信息;数据是标签的属性或标签所包含的文本。XML可用于数据存储、数据传输甚至作为应用程序的数据格式。其主要优点如下:
1. 标准化:XML是标准通用语言,无论在哪个领域都可以使用。
2. 可扩展:XML允许用户自定义元素和文字标识符,使其适用范围更广。
3. 可读性:XML文件本质是文本文件,读取和修改都非常方便。
4. 数据描述性好:XML对数据类型定义的支持度很高,可以通过DTD或XSD等实现数据定义的复杂性控制。
二、XML的应用
XML在各个领域都有极为广泛的应用,比如在Web开发,利用Ajax技术实现异步更新界面等。在Java编程中,通过JAXP(Java API for XML Parsing)解析XML文件,SAX与DOM两种解析方式都具有很好的可扩展性和可读性,广泛用于应用程序间数据交换方式。
在电子政务、电子商务等领域中,大量使用XML作为数据交换的标准,企业系统和数据集成等方面都需要使用XML技术。在系统设计和外接口中使用XML能使各系统间数据传输有更好的适应性、更高的互操作性和更高效的数据传输能力。例如,在SOA中,发布一个SOAP(Simple Object Access Protocol)服务时,需要在WSDL(Web Services Description Language)文档中定义服务元素、数据元素和运算符等信息,实现系统资源的松散耦合和互联互通。
三、XML的基本语法
XML文档的结构十分简单,由声明部分、元素部分和属性部分组成。其中,第一行为XML声明部分,用于标识XML版本、“字符集”方式及文件类型,必须定义在XML文档的第一行。
在XML中,元素属性必须使用单引号或双引号括起来,标签名不能以‘xml’作为前缀名称,各个元素必须有一个根元素。元素中的内容部分,将作为该元素的默认子元素表示,元素内嵌套的其他元素称为子元素,可以理解为树形嵌套结构,元素的顺序是按照文档顺序排列。
四、XML的解析方式
XML文档的解析方式有两种,分别是 DOM 和 SAX 两种方式。其中,DOM 是一种基于树形结构解析的方式,最大的特点是能够进行树形结构处理,把整个 XML 文档读入解析器中,形成一个 XML 文档树,它可以在内存中随意访问。与之不同的 SAX 是一种事件驱动的方式,读取 XML 文档是基于流式的方式。在解析大型文件时,SAX 的解析方式优于 DOM 的解析方式,因为它不需要消耗大量的内存,而是按照顺序处理 XML 元素。
下面我们通过实例学习 DOM 和 SAX 两种解析方式的使用方法。
DOM 解析:
我们通过解析以下 XML 文档来学习 DOM 解析方式。
张三
20
李四
18
DOM 解析方式的解析步骤如下。
1. 加载 XML 文档:通过解析器把 XML 文档加载到内存中;
2. 创建 DOM 对象:创建 XML 文档的 DOM 模型;
3. 遍历 DOM 模型:遍历模型、寻找节点信息、得到属性信息。
实现代码如下。
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DOMTest {
public static void main(String[] args){
// 创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
try {
// 创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
// 解析文件
Document document = builder.parse(new File("test.xml"));
// getElementsByTagName 方法获取 NodeList
NodeList userNodes = document.getElementsByTagName("user");
for(int i = 0; i < userNodes.getLength(); i++){
Node node = userNodes.item(i);
System.out.println("节点名称: " + node.getNodeName());
if(node.getNodeType() == Node.ELEMENT_NODE){
Element element = (Element)node;
System.out.println("姓名: " + element.getElementsByTagName("name").item(0).getTextContent());
System.out.println("年龄: " + element.getElementsByTagName("age").item(0).getTextContent());
} catch (Exception e) {
e.printStackTrace();
解析结果:
节点名称: user
姓名: 张三
年龄: 20
节点名称: user
姓名: 李四
年龄: 18
SAX 解析:
以下 XML 文件内容作为 SAX 解析实例。
张三
20
李四
18
SAX 解析方式的解析步骤如下:
1. 创建 SAX 解析器并注册事件监听器;
2. 设置事件监听器的相应事件回调方法;
3. 解析 XML 文件;
实现代码如下。
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
public class SAXTest {
public static void main(String[] args){
try {
// 创建 SAX 解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 创建 SAX 解析器
SAXParser parser = factory.newSAXParser();
// 创建事件监听器
DefaultHandler handler = new DefaultHandler(){
private StringBuilder nameBuilder = new StringBuilder();
private StringBuilder ageBuilder = new StringBuilder();
// 当解析到 XML 开始标签时就会调用这个方法
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if ("user".equals(qName)){
System.out.println("-----开始解析第 "+ (i++) +" 个 User-------");
// 清空 StringBuilder
nameBuilder.setLength(0);
ageBuilder.setLength(0);
// 当解析到文本节点时会执行这里
public void characters(char[] ch, int start, int length) throws SAXException {
if (thisTag.equals("name")){
nameBuilder.append(ch, start, length);
} else if (thisTag.equals("age")){
ageBuilder.append(ch, start, length);
// 当解析到 XML 结束标签时就会调用这个方法
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("user".equals(qName)){
System.out.println("姓名: " + nameBuilder.toString().trim());
System.out.println("年龄: " + ageBuilder.toString().trim());
};
// 设置事件监听器
parser.parse(new File("test.xml"), handler);
} catch (Exception e) {
e.printStackTrace();
解析结果:
-----开始解析第 1 个 User-------
姓名: 张三
年龄: 20
-----开始解析第 2 个 User-------
姓名: 李四
年龄: 18
五、总结
本文简要介绍了XML技术的基本概念、应用场景以及两种解析方式的使用方法。通常情况下,系统设计和外接口中使用XML能使系统间完成数据传输更高效,更互联互通和更具扩展性,以达到实现数据交互的标准化和高效性的目标。在实际开发中,以上的技术要点都需要了解和掌握。同时,建立自己的技术体系,通过实践不断提升才能真正掌握高效的数据交互技术。