xml tools 不支持局部格式化,必须将选中内容包裹在 root 元素中并确保编码无 bom、语法合法后才能格式化;大文件建议用 xmllint 替代。

不能直接格式化选中的 XML 代码段——XML Tools 插件只处理整个文档,且要求结构合法、编码正确。所谓“一键”是假象,真正起效前必须过三关:语法识别、编码无 BOM、内容合法。
为什么选中一段 XML 按 Ctrl+Alt+Shift+P 没反应
XML Tools 不支持局部格式化。它底层调用的是 DOM 解析器,必须加载完整文档树才能重排;选中部分代码时,插件甚至不触发解析流程,快捷键静默失效。
- 右下角状态栏未显示
XML(而是Plain text或HTML)→ 插件命令根本不可见 - 文件编码含
\ufeff(BOM),即使只选中一行,xml.etree.ElementTree也会在读取首字节时报UnicodeDecodeError - 选中内容里有裸露的
&,比如price=10&20→ 解析器卡在 token 匹配,直接退出,不报错也不格式化
想格式化选中内容,得先“骗过”解析器
本质是把选中片段临时包装成合法 XML 文档,再交给插件处理。操作路径固定:
- 全选你要格式化的 XML 片段(Ctrl+A 或鼠标拖选)
- 按 Ctrl+Shift+P → 输入
XML Tools: Wrap Selection in Root Element→ 回车(这会自动套上<root>...</root>) - 再按 Ctrl+Alt+Shift+P → 此时整个临时文档可被解析,缩进生效
- 格式化完手动删掉首尾的
<root></root>和(别用 Ctrl+Z,容易误删缩进)
注意:Wrap Selection in Root Element 不校验内部合法性,所以仍需提前清理 &、、<code>> 等非法字符。
大段 XML 选中后卡死?换 xmllint 流式处理
超过 500KB 的选中内容,XML Tools 加载 DOM 会吃光内存,界面冻结。此时应跳过 Sublime,用命令行兜底:
- 复制选中内容 → 新建空白文件 → 保存为
temp.xml - 终端执行:
xmllint --format temp.xml > formatted.xml - 如果报
not well-formed,说明原始选中内容有硬伤,用 Python 快速验证:python -c "import xml.etree.ElementTree as ET; ET.fromstring(r'<your copied xml>')"</your>
这个过程绕开了 Sublime 的 UI 线程阻塞,也避开了插件对 BOM 和编码的敏感依赖。
格式化后注释偏移、CDATA 展开,不是 bug 是设计
XML Tools 把 <!-- comment --> 当作普通节点重排位置,把 当作文本节点解码输出——这是它基于 xml.etree 的默认行为,配置项里没有开关能关掉。
如果你的 XML 里注释承担文档职责,或 CDATA 块内含 JS/SQL 代码,格式化前务必备份原段落。别指望 "preserve_whitespace": false 能保住它们的位置,它只控制空行,不控制注释和 CDATA 的语义处理逻辑。











