下面给你一份简洁明了、快速入门的《XML 处理指令(Processing Instruction, PI)基础指南》,帮助你快速理解它是什么、为什么存在、怎么写、怎么用。
📘 一、什么是 XML 处理指令(Processing Instruction, PI)?
处理指令(PI)是 XML 中一种专门给应用程序或解析器传递信息的指令。
基本格式:
<?target data?>
- target:指令的目标(给谁看的)
- data:传递给目标程序的信息
注意:
- PI 不是 XML 元素
- XML 解析器不会修改文档结构,只把 PI 交给对应的应用程序去解释
📘 二、最常见的处理指令示例
✔ 1. XML 文档声明(虽然不是严格意义上的 PI,但长得一样)
<?xml version="1.0" encoding="UTF-8"?>
- 特别注意:
xml是保留 target,不属于自定义 PI。
✔ 2. xml-stylesheet —— 最常用的 PI
用于告诉浏览器应该用哪个样式表(XSL、CSS)显示 XML。
例如将 XML 绑定到 XSLT 文件:
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
绑定 CSS:
<?xml-stylesheet type="text/css" href="style.css"?>
这是 XML WEB 展示中最常用的处理指令。
✔ 3. 自定义处理指令
一些应用程序会使用定制 PI 做标记、配置或处理控制。
例如:
<?printer color="true" copies="2"?>
由打印系统解析。
再如:
<?php echo 'Hello'; ?>
这是 PHP 在 HTML/XML 中的典型应用。
📘 三、处理指令的用途
处理指令帮助 XML 与外部应用通信:
| 用途 | 示例 |
|---|---|
| 指定样式表 | XSL、CSS |
| 指定外部系统行为 | 打印设置、渲染方案 |
| 文档处理提示 | 缓存、编译器提示 |
| 嵌入脚本语言指令 | PHP、ASP 等 |
| 为特定软件工具传参 | 编辑器、转换器 |
📘 四、处理指令的规则(必须记住!)
✔ 1. 不能使用目标名称 xml
<?xml something?> ❌ 错误
因为 xml 保留给 XML 声明。
✔ 2. 不能包含 ?> 字符
如果出现:
<?test data ?> more ?>
解析会出错。
✔ 3. PI 可以出现在文档几乎任何位置(但不能在标签内部)
正确:
<?note created="2025-11-24"?>
<root>...</root>
错误:
<root <?note x="1"?> >
✔ 4. PI 对 XML 结构无影响
它既不是节点,也不是标签,因此:
- 不形成父子关系
- 不参与文档树
- DOM 中会被解析为
ProcessingInstruction对象
📘 五、DOM 中如何读取处理指令?
✔ Java DOM
NodeList list = doc.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node node = list.item(i);
if (node.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE) {
System.out.println(node.getNodeName() + " : " + node.getNodeValue());
}
}
✔ JavaScript(浏览器)
[...xml.childNodes].forEach(n => {
if (n.nodeType === Node.PROCESSING_INSTRUCTION_NODE) {
console.log(n.target, n.data);
}
});
📘 六、实际应用场景(最常见 3 类)
1. XML + XSLT 展示网页(经典用法)
<?xml-stylesheet type="text/xsl" href="news.xsl"?>
2. 专有软件的控制指令
如 PDF 转换工具:
<?pdf page-size="A4" margin="10"?>
3. 嵌入 PHP/模板引擎
<?php echo $title; ?>
📘 七、总结(重要概念回顾)
- Processing Instruction = 给应用程序看的指令,不是 XML 的一部分。
- 格式:
<?target data?> xml不能作为 target。- PI 不影响 XML 结构。
- 浏览器、转换器、编辑器可根据 PI 执行特殊操作。
- 最常用的处理指令是:
<?xml-stylesheet ... ?>