XML处理指令(PI)语法为,target是必需标识符(如xml、xsl),content为参数字符串;仅被解析器强制处理且须位于文档开头,其余PI由应用自定义并需用支持PI的解析器读取。

XML处理指令的语法和基本作用
XML处理指令(Processing Instruction,简称PI)是XML文档中用来向解析器或下游应用程序传递特定指令的标记,它既不是元素也不是注释,而是以形式存在的独立结构。其中target是必须的标识符(如xml、php、xsl),content是任意字符串(不包含?> 序列),用于携带参数或配置信息。
常见的target值及其含义
不同target代表不同预期接收方:xml是唯一被XML规范硬性保留的target(仅允许出现在文档开头,用于声明版本和编码);其余如xsl、php、myapp等均由应用自行约定。解析器通常忽略不认识的target,但会保留PI节点供上层程序读取。
在DOM解析中读取处理指令内容
大多数XML解析器(如JavaScript的DOMParser、Python的xml.etree.ElementTree)默认不将PI作为普通节点暴露。需使用支持PI的解析器或启用特定选项:
- JavaScript中
DOMParser会把PI转为ProcessingInstruction节点,可通过node.target和node.data访问 - Python的
lxml.etree支持PI,用iterparse或getroot().itersiblings(preceding=True)配合pi.tag == 'pi'判断 -
xml.etree.ElementTree原生不支持PI,遇到时直接跳过——这是最容易踩的坑
const xml = ``; const parser = new DOMParser(); const doc = parser.parseFromString(xml, "application/xml"); const pi = doc.firstChild; // ProcessingInstruction节点 console.log(pi.target); // "myapp" console.log(pi.data); // "mode=\"prod\" timeout=\"3000\"" - A
用正则提取PI内容的风险与替代方案
不要用RegExp直接匹配\w+.*?\?>来解析PI——XML允许PI内容中包含?(只要不连续成?>),且可能跨行或含CDATA,正则极易误判。正确做法是依赖成熟解析器的PI节点接口,或使用专门的PI提取工具(如libxml2的xmlParsePI)。
如果必须手写解析(例如嵌入式环境),至少要严格遵循XML 1.0规范第2.6节对PI的定义:从开始,到第一个未被转义的?>结束,中间不允许有或&(除非实体化),且target必须是Name生产式。










