在XML应用中,我们经常需要把多个文档关联起来。HTML的a标签只能做单向跳转,而XLink(XML Linking Language)专门为XML设计,支持更丰富的链接语义,比如双向链接、多终点链接和资源引用。通过XLink,我们可以在XML文档间创建标准的超链接功能。

XLink是什么
XLink是W3C推荐的规范,用来在XML文档中插入链接。它定义了一组属性,放在元素上就能让该元素变成链接起点。最常用的两种链接类型是简单链接(simple link)和扩展链接(extended link)。
简单链接的实现
简单链接类似HTML的a标签,从一个资源指向另一个资源。我们需要声明XLink命名空间,并设置xlink:type为simple,再用xlink:href写目标地址。
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- 简单链接:点击跳转到另一个XML文档 -->
<doclink xlink:type="simple"
xlink:href="https://ipipp.com/data/other.xml"
xlink:show="new"
xlink:actuate="onRequest">
打开关联文档
</doclink>
</root>
上面代码中,xlink:show="new"表示在新窗口打开,xlink:actuate="onRequest"表示用户触发时才加载。这样就在XML里建立了基础超链接。
扩展链接实现多文档关联
扩展链接可在一个元素内描述多个资源与弧(arc),适合复杂文档网络。下面示例把当前文档和两个外部XML关联,并定义它们之间的遍历关系。
<?xml version="1.0"?>
<links xmlns:xlink="http://www.w3.org/1999/xlink"
xlink:type="extended">
<!-- 本地资源 -->
<item xlink:type="resource" xlink:label="start">首页数据</item>
<!-- 远程资源A -->
<item xlink:type="locator"
xlink:href="https://ipipp.com/a.xml"
xlink:label="a"/>
<!-- 远程资源B -->
<item xlink:type="locator"
xlink:href="https://ipipp.com/b.xml"
xlink:label="b"/>
<!-- 定义从start到a和b的弧 -->
<go xlink:type="arc"
xlink:from="start" xlink:to="a"
xlink:show="replace"/>
<go xlink:type="arc"
xlink:from="start" xlink:to="b"
xlink:show="new"/>
</links>
核心属性说明
| 属性 | 作用 |
|---|---|
| xlink:type | 声明链接类型,如simple、extended、locator、arc、resource |
| xlink:href | 目标资源地址,支持HTTP或本地路径 |
| xlink:show | 打开方式,replace表示替换,new表示新上下文 |
| xlink:actuate | 触发时机,onRequest为用户请求,onLoad为加载即触发 |
在程序中解析XLink
多数XML解析器不会自动处理XLink语义,需要代码读取属性。以下Java片段演示如何提取简单链接地址:
import org.w3c.dom.*;
import javax.xml.parsers.*;
public class XLinkDemo {
public static void main(String[] args) throws Exception {
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = db.parse("https://ipipp.com/data/test.xml");
NodeList list = doc.getElementsByTagName("doclink");
for (int i = 0; i < list.getLength(); i++) {
Element e = (Element) list.item(i);
// 读取xlink:href属性
String href = e.getAttributeNS("http://www.w3.org/1999/xlink", "href");
System.out.println("找到链接: " + href);
}
}
}
通过以上方式,你可以把XLink集成到自己的XML处理流程里,实现文档间的超链接与资源调度。