使用正则实现XML格式化:合并CDATA收尾行与对应标签行并匹配缩进
存量XML文件CDATA格式化正则实现方案
针对需要把独立换行的CDATA闭合标记]]>和相邻闭合标签合并、对齐缩进的需求,可通过以下匹配替换逻辑实现:
核心正则匹配规则
正则匹配需要精准识别跨三行的CDATA格式异常特征,拆分捕获段保证缩进可追溯,最终匹配表达式为:
^(\s*)<([\w:.-]+)[^>]*><!\[CDATA\[[\s\S]*?\n\s*\]\>\n\s*(</\2>)\s*$
- 表达式需要开启全局匹配、多行匹配模式才能批量处理整个XML文件的内容
- 捕获段说明:
- 组1:对应起始标签所在行的前置缩进,作为后续合并行的对齐基准
- 组2:带命名空间、特殊属性的起始标签名,通过反向引用保证匹配到的
]]>和闭合标签是同一节点下的内容 - 组3:和起始标签对应的完整闭合标签内容
- 非贪婪匹配标记
*?避免跨多个CDATA块出现错误匹配
替换逻辑
按照捕获段重排文本结构,替换格式为:
$1<$2><![CDATA[ 原CDATA段内部内容 $1]]>$3
替换后自动实现两个效果:
- 原本独立占行的
]]>不再单独换行,直接和后面的闭合标签拼在同一行 - 整行缩进完全和对应起始标签的缩进保持一致,不需要手动适配不同嵌套层级的缩进值
效果验证
原始XML片段
<search> <query><![CDATA[ testline1 ]]> </query> </search>
转换后格式
<search> <query><![CDATA[ testline1 ]]></query> </search>
适配注意事项
- 支持带命名空间的标签匹配,适配实际生产环境的XML标签格式
- 不会修改CDATA段内部的原有换行和缩进,仅调整
]]>标记和闭合标签的位置 - 对无嵌套、独立行书写的CDATA块不会产生误匹配
内容的提问来源于stack exchange,提问作者S.J.
相关产品推荐
相关产品推荐

